From b08d349b45605e464c83ae7ca748355a35297f10 Mon Sep 17 00:00:00 2001 From: cjl Date: Tue, 29 Jan 2019 10:33:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=87=BA=E5=BA=93=E6=97=B6?= =?UTF-8?q?=E5=BC=80=E5=90=AF=E5=BA=8F=E5=88=97=E5=8F=B7=E7=9A=84=E5=95=86?= =?UTF-8?q?=E5=93=81=E5=BC=BA=E5=88=B6=E9=99=84=E5=8A=A0=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- erp_web/js/pages/materials/in_out.js | 204 +++++++++--- erp_web/pages/manage/serialNumber.html | 4 +- erp_web/pages/materials/material.html | 4 +- sql/jsh_erp.sql | 24 +- sql/华夏ERP数据库设计汇总.xlsx | Bin 72886 -> 73471 bytes .../jsh/erp/constants/BusinessConstants.java | 39 ++- .../jsh/erp/constants/ExceptionConstants.java | 3 + .../jsh/erp/controller/DepotController.java | 304 +++++++++--------- .../erp/controller/DepotHeadController.java | 71 ++++ .../erp/controller/DepotItemController.java | 2 +- .../erp/controller/SupplierController.java | 7 +- .../jsh/erp/datasource/entities/Material.java | 6 +- .../datasource/entities/MaterialExample.java | 66 ++++ .../datasource/entities/MaterialVo4Unit.java | 6 +- .../erp/datasource/entities/SerialNumber.java | 25 +- .../entities/SerialNumberExample.java | 120 +++++-- .../datasource/mappers/DepotHeadMapper.java | 81 ----- .../datasource/mappers/DepotHeadMapperEx.java | 110 +++++++ .../datasource/mappers/DepotItemMapper.java | 117 ------- .../datasource/mappers/DepotItemMapperEx.java | 148 +++++++++ .../mappers/SerialNumberMapperEx.java | 17 +- .../service/depotHead/DepotHeadService.java | 156 ++++++++- .../service/depotItem/DepotItemService.java | 118 +++++-- .../serialNumber/SerialNumberService.java | 76 ++++- .../erp/service/supplier/SupplierService.java | 9 +- .../mapper_xml/DepotHeadMapperEx.xml | 112 ++++++- .../mapper_xml/DepotItemMapperEx.xml | 42 ++- .../resources/mapper_xml/MaterialMapper.xml | 8 +- .../resources/mapper_xml/MaterialMapperEx.xml | 34 +- .../mapper_xml/SerialNumberMapper.xml | 51 +-- .../mapper_xml/SerialNumberMapperEx.xml | 124 +++++-- 31 files changed, 1521 insertions(+), 567 deletions(-) create mode 100644 src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapperEx.java create mode 100644 src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapperEx.java diff --git a/erp_web/js/pages/materials/in_out.js b/erp_web/js/pages/materials/in_out.js index cfa761ff..d9c9d249 100644 --- a/erp_web/js/pages/materials/in_out.js +++ b/erp_web/js/pages/materials/in_out.js @@ -23,7 +23,8 @@ var organUrl = ""; //组织数据接口地址 var amountNum = ""; //单据编号开头字符 var depotString = ""; //店铺id列表 - var orgDefaultId = 0; //单位默认编号 + /**默认编号有意义吗,不如空着吧*/ + var orgDefaultId=''; //单位默认编号 var orgDefaultList; //存储查询出来的会员列表 var accountList; //账户列表 var outItemList; //支出项目列表 @@ -682,7 +683,7 @@ } } thisStock = (thisStock / loadRatio).toFixed(2); - body.find("[field='Stock']").find(input).val(thisStock).attr("data-stock", res.rows[0].thisSum); //加载库存数据 + body.find("[field='Stock']").find(input).val(thisStock).attr("data-stock", res.data.page[0].thisSum); //加载库存数据 } else { body.find("[field='Stock']").find(input).val(0).attr("data-stock", 0); //加载库存数据 @@ -757,14 +758,20 @@ anotherDepotTextField = "depotName"; } if(listSubType == "礼品充值"){ + /** + * who added the .action + * */ isShowAnotherDepot = false; //礼品充值时候显示礼品卡 anotherDepotHeadName = "礼品卡"; - anotherDepotUrl = "/depot/findGiftByType.action?type=1"; + anotherDepotUrl = "/depot/findGiftByType?type=1"; anotherDepotTextField = "name"; } if(listSubType == "礼品销售"){ + /** + * who added the .action + * */ depotHeadName = "礼品卡"; - depotUrl = "/depot/findGiftByType.action?type=1"; + depotUrl = "/depot/findGiftByType?type=1"; depotTextField = "name"; } else { @@ -1290,8 +1297,12 @@ if (r) { $.ajax({ type:"post", - url: "/depotHead/" + depotHeadID + "/delete", + // url: "/depotHead/" + depotHeadID + "/delete", + url: "/depotHead/deleteDepotHeadAndDetail", dataType: "json", + data:{ + id: depotHeadID + }, success: function (res) { if(res && res.code == 200) { $("#searchBtn").click(); @@ -1382,7 +1393,8 @@ //批量删除 $.ajax({ type:"post", - url: "/depotHead/batchDelete", + // url: "/depotHead/batchDelete", + url: "/depotHead/batchDeleteDepotHeadAndDetail", dataType: "json", async : false, data: ({ @@ -1560,7 +1572,7 @@ $("#addOrgan").off("click").on("click",function(){ $('#supplierDlg').dialog('open').dialog('setTitle',' 增加供应商信息'); }); - url = '/depotHead/add'; + url = '/depotHead/addDepotHeadAndDetail'; //零售单据修改收款时,自动计算找零 if(listSubType == "零售" || listSubType == "零售退货") { @@ -1628,7 +1640,7 @@ } $("#Number").val(depotHeadInfo[2]).attr("data-defaultNumber",depotHeadInfo[2]); $("#OperTime").val(depotHeadInfo[4]); - $('#OrganId').combobox('setValue', depotHeadInfo[5]); + $('#OrganId').combobox('setValue', depotHeadInfo[5]=='undefined'?'':depotHeadInfo[5]); $("#HandsPersonId").val(depotHeadInfo[6]); $("#AccountId").val(depotHeadInfo[7]); $("#ChangeAmount").val(depotHeadInfo[8]); @@ -1715,7 +1727,7 @@ initTableData_material("edit",TotalPrice); //商品列表 reject(); //撤销下、刷新商品列表 - url = '/depotHead/update?id=' + depotHeadInfo[0]; + url = '/depotHead/updateDepotHeadAndDetail?id=' + depotHeadInfo[0]; } //查看信息 @@ -1899,6 +1911,18 @@ return flag; } //保存信息 + /** + * 2019-01-25 + * 我对这个方法的实现结果存在严重怀疑,决定重构 + * 有如下疑点: + * 1、保存完主表,返回结果后,再发起请求去操作子表,如何保证事务的一致性(业务数据一致性) + * 2、保存完主表后,再通过selectmax的方式去获取主表主键id完全就是看人品的不可靠的思路 + * 修改计划: + * 2019-01-25修改零售出库相关操作 + * 修改方式,重写url,将主从表操作合并 + * + * + * **/ $("#saveDepotHead").off("click").on("click",function(){ if(!$('#depotHeadFM').form('validate')){ return; @@ -1961,6 +1985,7 @@ $.messager.alert('提示', '选择多账户时的找零金额不能大于0!', 'warning'); return; } + } else if(listTitle === "销售出库列表"){ if(!$('#OrganId').combobox('getValue')){ @@ -2052,38 +2077,49 @@ if($("#AccountId").val() === "many"){ //多账户 getAccountID = null; } + var infoStr=JSON.stringify({ + Type: listType, + SubType: listSubType, + ProjectId: ProjectId, + AllocationProjectId: AllocationProjectId, + DefaultNumber: $.trim($("#Number").attr("data-defaultNumber")),//初始编号 + Number: $.trim($("#Number").val()), + OperTime: $("#OperTime").val(), + OrganId: OrganId, + HandsPersonId: $.trim($("#HandsPersonId").val()), + Salesman: SalesmanStr, //销售人员 + AccountId: getAccountID, + ChangeAmount: ChangeAmount, //付款/收款 + TotalPrice: TotalPrice, //合计 + PayType: thisPayType, //现付/预付款 + Remark: $.trim($("#Remark").val()), + AccountIdList: $("#AccountId").attr("data-accountarr"), //账户列表-多账户 + AccountMoneyList: accountMoneyArr ? JSON.stringify(accountMoneyArr) : "", //账户金额列表-多账户 + Discount: $.trim($("#Discount").val()), + DiscountMoney: $.trim($("#DiscountMoney").val()), + DiscountLastMoney: $.trim($("#DiscountLastMoney").val()), + OtherMoney: $.trim($("#OtherMoney").val()), //采购费用、销售费用 + OtherMoneyList: $("#OtherMoney").attr("data-itemarr"), //支出项目列表-涉及费用 + OtherMoneyItem: $("#OtherMoney").attr("data-itemmoneyarr"), //支出项目金额列表-涉及费用 + AccountDay: $("#AccountDay").val() //结算天数 + }); + /** + * 零售出库,单独操作 + * */ + if(url.indexOf("/depotHead/addDepotHeadAndDetail")>=0){ + addDepotHeadAndDetail(url,infoStr); + return; + }else if(url.indexOf("/depotHead/updateDepotHeadAndDetail")>=0){ + updateDepotHeadAndDetail(url,infoStr,preTotalPrice); + return; + } $.ajax({ type:"post", url: url, dataType: "json", async : false, data: ({ - info : JSON.stringify({ - Type: listType, - SubType: listSubType, - ProjectId: ProjectId, - AllocationProjectId: AllocationProjectId, - DefaultNumber: $.trim($("#Number").attr("data-defaultNumber")),//初始编号 - Number: $.trim($("#Number").val()), - OperTime: $("#OperTime").val(), - OrganId: OrganId, - HandsPersonId: $.trim($("#HandsPersonId").val()), - Salesman: SalesmanStr, //销售人员 - AccountId: getAccountID, - ChangeAmount: ChangeAmount, //付款/收款 - TotalPrice: TotalPrice, //合计 - PayType: thisPayType, //现付/预付款 - Remark: $.trim($("#Remark").val()), - AccountIdList: $("#AccountId").attr("data-accountarr"), //账户列表-多账户 - AccountMoneyList: accountMoneyArr ? JSON.stringify(accountMoneyArr) : "", //账户金额列表-多账户 - Discount: $.trim($("#Discount").val()), - DiscountMoney: $.trim($("#DiscountMoney").val()), - DiscountLastMoney: $.trim($("#DiscountLastMoney").val()), - OtherMoney: $.trim($("#OtherMoney").val()), //采购费用、销售费用 - OtherMoneyList: $("#OtherMoney").attr("data-itemarr"), //支出项目列表-涉及费用 - OtherMoneyItem: $("#OtherMoney").attr("data-itemmoneyarr"), //支出项目金额列表-涉及费用 - AccountDay: $("#AccountDay").val() //结算天数 - }) + info:infoStr }), success: function (tipInfo) { @@ -2955,7 +2991,103 @@ } } - + /** + * 新增单据主表及单据子表 + * */ + function addDepotHeadAndDetail(url,infoStr){ + var inserted = $("#materialData").datagrid('getChanges', "inserted"); + var deleted = $("#materialData").datagrid('getChanges', "deleted"); + var updated = $("#materialData").datagrid('getChanges', "updated"); + $.ajax({ + type:"post", + url: url, + dataType: "json", + async : false, + data: ({ + info:infoStr, + inserted: JSON.stringify(inserted), + deleted: JSON.stringify(deleted), + updated: JSON.stringify(updated) + }), + success: function (tipInfo){ + + if(tipInfo){ + if(tipInfo.code!=200){ + $.messager.alert('提示', tipInfo.msg, 'error'); + return; + } + $.messager.alert('提示','保存成功!','info'); + $('#depotHeadDlg').dialog('close'); + var opts = $("#tableData").datagrid('options'); + showDepotHeadDetails(opts.pageNumber,opts.pageSize); + + }else { + $.messager.show({ + title: '错误提示', + msg: '保存信息失败,请稍后重试!' + }); + } + + }, + //此处添加错误处理 + error:function() + { + $.messager.alert('提示','保存信息异常,请稍后再试!','error'); + return; + } + + + }); + } + /** + * 修改单据主表及单据子表 + * */ + function updateDepotHeadAndDetail(url,infoStr,preTotalPrice){ + var inserted = $("#materialData").datagrid('getChanges', "inserted"); + var deleted = $("#materialData").datagrid('getChanges', "deleted"); + var updated = $("#materialData").datagrid('getChanges', "updated"); + $.ajax({ + type:"post", + url: url, + dataType: "json", + async : false, + data: ({ + id:url.substring(url.lastIndexOf("?id=")+4,url.length), + info:infoStr, + inserted: JSON.stringify(inserted), + deleted: JSON.stringify(deleted), + updated: JSON.stringify(updated), + preTotalPrice:preTotalPrice + }), + success: function (tipInfo){ + if(tipInfo){ + if(tipInfo.code!=200){ + $.messager.alert('提示', tipInfo.msg, 'error'); + return; + } + $.messager.alert('提示','保存成功!','info'); + $('#depotHeadDlg').dialog('close'); + var opts = $("#tableData").datagrid('options'); + showDepotHeadDetails(opts.pageNumber,opts.pageSize); + if (endEditing()) { + $('#materialData').datagrid('acceptChanges'); + } + }else { + $.messager.show({ + title: '错误提示', + msg: '保存信息失败,请稍后重试!' + }); + } + + }, + //此处添加错误处理 + error:function() + { + $.messager.alert('提示','保存信息异常,请稍后再试!','error'); + return; + } + }); + } diff --git a/erp_web/pages/manage/serialNumber.html b/erp_web/pages/manage/serialNumber.html index 2ad42c73..5b19750b 100644 --- a/erp_web/pages/manage/serialNumber.html +++ b/erp_web/pages/manage/serialNumber.html @@ -155,11 +155,11 @@ {title: '商品名称', field: 'materialName', width: 100}, {title: '序列号', field: 'serialNumber', width: 80}, {title: '已卖出', field: 'isSell', width: 150 , formatter: function (value) { - return value ? "是" : "否"; + return value=='1' ? "是" : "否"; } }, {title: '已删除', field: 'deleteFlag', width: 60, formatter: function (value) { - return value ? "是" : "否"; + return value=='1' ? "是" : "否"; } }, {title: '创建时间', field: 'createTime', width: 140,formatter: formatDatebox}, diff --git a/erp_web/pages/materials/material.html b/erp_web/pages/materials/material.html index 63c791e6..8f53413b 100644 --- a/erp_web/pages/materials/material.html +++ b/erp_web/pages/materials/material.html @@ -684,7 +684,7 @@ }, { title: '序列号', field: 'enableSerialNumber', width: 70, align: "center", formatter: function (value) { - return value ? "启用" : "禁用"; + return value=='1' ? "启用" : "禁用"; } } ]], @@ -1363,7 +1363,7 @@ // console.log("enableSerialNumber:"+(materialInfo[24]=='true'?'1':'0')); // console.log("enableSerialNumber:"+materialInfo[24]); // $("#enableSerialNumber").combobox('setValue',materialInfo[24]=='true'?'1':'0'); - $("#enableSerialNumber").val(materialInfo[24]=='true'?'1':'0'); + $("#enableSerialNumber").val(materialInfo[24]=='1'?'1':'0'); // console.log($("#enableSerialNumber").val()); var categoryName = ""; //类型名称 diff --git a/sql/jsh_erp.sql b/sql/jsh_erp.sql index e62ae3af..74c8c29a 100644 --- a/sql/jsh_erp.sql +++ b/sql/jsh_erp.sql @@ -5219,5 +5219,25 @@ alter table jsh_material add enableSerialNumber bit(1) DEFAULT 0 COMMENT '是否 -- ---------------------------- delete from `jsh_functions` where Name='序列号'; INSERT INTO `jsh_functions`(`Number`, `Name`, `PNumber`, `URL`, `State`, `Sort`, `Enabled`, `Type`, `PushBtn`) VALUES ('010104', '序列号', '0101', '../manage/serialNumber.html', b'0', '0246', b'1', '电脑版', ''); - - +-- ---------------------------- +-- 删除单据主表供应商id字段对应外键约束 +-- ---------------------------- +ALTER TABLE jsh_depothead DROP FOREIGN KEY jsh_depothead_ibfk_3; +-- ---------------------------- +-- 序列号表添加单据主表id字段,用于跟踪序列号流向 +-- ---------------------------- +alter table jsh_serial_number add depothead_Id bigint(20) DEFAULT null COMMENT '单据主表id,用于跟踪序列号流向'; +-- ---------------------------- +-- 修改商品表enableSerialNumber字段类型为varchar(1) +-- ---------------------------- +alter table jsh_material change enableSerialNumber enableSerialNumber varchar(1) DEFAULT '0' COMMENT '是否开启序列号,0否,1是'; +-- ---------------------------- +-- 修改序列号表is_Sell字段类型为varchar(1) +-- 修改序列号表delete_Flag字段类型为varchar(1) +-- ---------------------------- +alter table jsh_serial_number change is_Sell is_Sell varchar(1) DEFAULT '0' COMMENT '是否卖出,0未卖出,1卖出'; +alter table jsh_serial_number change delete_Flag delete_Flag varchar(1) DEFAULT '0' COMMENT '删除标记,0未删除,1删除'; +-- ---------------------------- +-- 删除单据子表单据主表id字段对应外键约束 +-- ---------------------------- +ALTER TABLE jsh_depotitem DROP FOREIGN KEY jsh_depotitem_ibfk_1; \ No newline at end of file diff --git a/sql/华夏ERP数据库设计汇总.xlsx b/sql/华夏ERP数据库设计汇总.xlsx index cc2f72eac926f13e9401333c6794987b6c9af81b..8bf618b51313fbdda0a0a45487be8eecc5c028e2 100644 GIT binary patch delta 52736 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 E4=1kdLI3~& delta 52293 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�`^p8^D5E2KUt2k5g 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 O1gMH_9Y3%fV*mg%r2g;# diff --git a/src/main/java/com/jsh/erp/constants/BusinessConstants.java b/src/main/java/com/jsh/erp/constants/BusinessConstants.java index 9842ebff..789a9590 100644 --- a/src/main/java/com/jsh/erp/constants/BusinessConstants.java +++ b/src/main/java/com/jsh/erp/constants/BusinessConstants.java @@ -21,18 +21,45 @@ public class BusinessConstants { * 默认的分页页数 */ public static final String DEFAULT_PAGINATION_PAGE_SIZE = "10"; - /** - * 商品是否开启序列号标识enableSerialNumber 0否false,1是true - * - * */ - public static final boolean MATERIAL_ENABLE_SERIAL_NUMBER = true; - public static final boolean MATERIAL_NOT_ENABLE_SERIAL_NUMBER = false; /** * 单据主表出入库类型 type 入库 出库 * depothead * */ public static final String DEPOTHEAD_TYPE_STORAGE = "入库"; public static final String DEPOTHEAD_TYPE_OUT = "出库"; + /** + * 付款类型 payType //现付/预付款 + * */ + public static final String PAY_TYPE_PREPAID = "预付款"; + public static final String PAY_TYPE_BY_CASH = "现付"; + /** + * 删除标记 deleteFlag '0'未删除 '1'已删除 + * */ + public static final String DELETE_FLAG_DELETED = "1"; + public static final String DELETE_FLAG_EXISTS = "0"; + /** + * 是否卖出 isSell '0'未卖出 '1'已卖出 + * */ + public static final String IS_SELL_SELLED = "1"; + public static final String IS_SELL_HOLD = "0"; + /** + * 商品是否开启序列号标识enableSerialNumber '0'未启用 '1'启用 + * */ + public static final String ENABLE_SERIAL_NUMBER_ENABLED = "1"; + public static final String ENABLE_SERIAL_NUMBER_NOT_ENABLED = "0"; + /** + * 出入库分类 + *采购、采购退货、其它、零售、销售、调拨、礼品充值 + * */ + public static final String SUB_TYPE_PURCHASE = "采购"; + public static final String SUB_TYPE_PURCHASE_TETURNS = "采购退货"; + public static final String SUB_TYPE_OTHER = "其它"; + public static final String SUB_TYPE_RETAIL = "零售"; + public static final String SUB_TYPE_SALES = "销售"; + public static final String SUB_TYPE_TRANSFER = "调拨"; + + + diff --git a/src/main/java/com/jsh/erp/constants/ExceptionConstants.java b/src/main/java/com/jsh/erp/constants/ExceptionConstants.java index 913eaf53..6e795ca1 100644 --- a/src/main/java/com/jsh/erp/constants/ExceptionConstants.java +++ b/src/main/java/com/jsh/erp/constants/ExceptionConstants.java @@ -34,6 +34,9 @@ public class ExceptionConstants { /**序列号不能为为空*/ public static final int SERIAL_NUMBERE_NOT_BE_EMPTY_CODE = 10500000; public static final String SERIAL_NUMBERE_NOT_BE_EMPTY_MSG = "序列号不能为为空"; + /**商品%s下序列号不充足,请补充后重试*/ + public static final int MATERIAL_SERIAL_NUMBERE_NOT_ENOUGH_CODE = 10500000; + public static final String MATERIAL_SERIAL_NUMBERE_NOT_ENOUGH_MSG = "商品:%s下序列号不充足,请补充后重试"; diff --git a/src/main/java/com/jsh/erp/controller/DepotController.java b/src/main/java/com/jsh/erp/controller/DepotController.java index 64a6c840..3a195a1e 100644 --- a/src/main/java/com/jsh/erp/controller/DepotController.java +++ b/src/main/java/com/jsh/erp/controller/DepotController.java @@ -1,152 +1,152 @@ -package com.jsh.erp.controller; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.jsh.erp.datasource.entities.Depot; -import com.jsh.erp.service.depot.DepotService; -import com.jsh.erp.service.userBusiness.UserBusinessService; -import com.jsh.erp.utils.BaseResponseInfo; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.dao.DataAccessException; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; -import java.util.List; - -/** - * @author ji sheng hua 752*718*920 - */ -@RestController -@RequestMapping(value = "/depot") -public class DepotController { - private Logger logger = LoggerFactory.getLogger(DepotController.class); - - @Resource - private DepotService depotService; - - @Resource - private UserBusinessService userBusinessService; - - @GetMapping(value = "/getAllList") - public BaseResponseInfo getAllList(HttpServletRequest request) { - BaseResponseInfo res = new BaseResponseInfo(); - try { - List depotList = depotService.getAllList(); - res.code = 200; - res.data = depotList; - } catch(Exception e){ - e.printStackTrace(); - res.code = 500; - res.data = "获取数据失败"; - } - return res; - } - - /** - * 用户对应仓库显示 - * @param type - * @param keyId - * @param request - * @return - */ - @PostMapping(value = "/findUserDepot") - public JSONArray findUserDepot(@RequestParam("UBType") String type, @RequestParam("UBKeyId") String keyId, - HttpServletRequest request) { - JSONArray arr = new JSONArray(); - try { - List dataList = depotService.findUserDepot(); - //开始拼接json数据 - JSONObject outer = new JSONObject(); - outer.put("id", 1); - outer.put("text", "仓库列表"); - outer.put("state", "open"); - //存放数据json数组 - JSONArray dataArray = new JSONArray(); - if (null != dataList) { - for (Depot depot : dataList) { - JSONObject item = new JSONObject(); - item.put("id", depot.getId()); - item.put("text", depot.getName()); - //勾选判断1 - Boolean flag = false; - try { - flag = userBusinessService.checkIsUserBusinessExist(type, keyId, "[" + depot.getId().toString() + "]"); - } catch (Exception e) { - logger.error(">>>>>>>>>>>>>>>>>设置用户对应的仓库:类型" + type + " KeyId为: " + keyId + " 存在异常!"); - } - if (flag == true) { - item.put("checked", true); - } - //结束 - dataArray.add(item); - } - } - outer.put("children", dataArray); - arr.add(outer); - } catch (Exception e) { - e.printStackTrace(); - } - return arr; - } - - @GetMapping(value = "/findDepotByUserId") - public JSONArray findDepotByUserId(@RequestParam("UBType") String type, @RequestParam("UBKeyId") String keyId, - HttpServletRequest request) { - JSONArray arr = new JSONArray(); - try { - List dataList = depotService.findUserDepot(); - //开始拼接json数据 - if (null != dataList) { - for (Depot depot : dataList) { - JSONObject item = new JSONObject(); - //勾选判断1 - Boolean flag = false; - try { - flag = userBusinessService.checkIsUserBusinessExist(type, keyId, "[" + depot.getId().toString() + "]"); - } catch (DataAccessException e) { - logger.error(">>>>>>>>>>>>>>>>>查询用户对应的仓库:类型" + type + " KeyId为: " + keyId + " 存在异常!"); - } - if (flag == true) { - item.put("id", depot.getId()); - item.put("depotName", depot.getName()); - arr.add(item); - } - } - } - } catch (Exception e) { - e.printStackTrace(); - } - return arr; - } - - /** - * 查找礼品卡-虚拟仓库 - * @param type - * @param request - * @return - */ - @PostMapping(value = "/findGiftByType") - public JSONArray findGiftByType(@RequestParam("type") Integer type, - HttpServletRequest request) { - JSONArray arr = new JSONArray(); - try { - List dataList = depotService.findGiftByType(type); - //存放数据json数组 - if (null != dataList) { - for (Depot depot : dataList) { - JSONObject item = new JSONObject(); - item.put("id", depot.getId()); - //仓库名称 - item.put("name", depot.getName()); - arr.add(item); - } - } - } catch (Exception e) { - logger.error(">>>>>>>>>查找仓库信息异常", e); - } - return arr; - } -} +package com.jsh.erp.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jsh.erp.datasource.entities.Depot; +import com.jsh.erp.service.depot.DepotService; +import com.jsh.erp.service.userBusiness.UserBusinessService; +import com.jsh.erp.utils.BaseResponseInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.dao.DataAccessException; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.util.List; + +/** + * @author ji sheng hua 752*718*920 + */ +@RestController +@RequestMapping(value = "/depot") +public class DepotController { + private Logger logger = LoggerFactory.getLogger(DepotController.class); + + @Resource + private DepotService depotService; + + @Resource + private UserBusinessService userBusinessService; + + @GetMapping(value = "/getAllList") + public BaseResponseInfo getAllList(HttpServletRequest request) { + BaseResponseInfo res = new BaseResponseInfo(); + try { + List depotList = depotService.getAllList(); + res.code = 200; + res.data = depotList; + } catch(Exception e){ + e.printStackTrace(); + res.code = 500; + res.data = "获取数据失败"; + } + return res; + } + + /** + * 用户对应仓库显示 + * @param type + * @param keyId + * @param request + * @return + */ + @PostMapping(value = "/findUserDepot") + public JSONArray findUserDepot(@RequestParam("UBType") String type, @RequestParam("UBKeyId") String keyId, + HttpServletRequest request) { + JSONArray arr = new JSONArray(); + try { + List dataList = depotService.findUserDepot(); + //开始拼接json数据 + JSONObject outer = new JSONObject(); + outer.put("id", 1); + outer.put("text", "仓库列表"); + outer.put("state", "open"); + //存放数据json数组 + JSONArray dataArray = new JSONArray(); + if (null != dataList) { + for (Depot depot : dataList) { + JSONObject item = new JSONObject(); + item.put("id", depot.getId()); + item.put("text", depot.getName()); + //勾选判断1 + Boolean flag = false; + try { + flag = userBusinessService.checkIsUserBusinessExist(type, keyId, "[" + depot.getId().toString() + "]"); + } catch (Exception e) { + logger.error(">>>>>>>>>>>>>>>>>设置用户对应的仓库:类型" + type + " KeyId为: " + keyId + " 存在异常!"); + } + if (flag == true) { + item.put("checked", true); + } + //结束 + dataArray.add(item); + } + } + outer.put("children", dataArray); + arr.add(outer); + } catch (Exception e) { + e.printStackTrace(); + } + return arr; + } + + @RequestMapping(value = "/findDepotByUserId") + public JSONArray findDepotByUserId(@RequestParam("UBType") String type, @RequestParam("UBKeyId") String keyId, + HttpServletRequest request) { + JSONArray arr = new JSONArray(); + try { + List dataList = depotService.findUserDepot(); + //开始拼接json数据 + if (null != dataList) { + for (Depot depot : dataList) { + JSONObject item = new JSONObject(); + //勾选判断1 + Boolean flag = false; + try { + flag = userBusinessService.checkIsUserBusinessExist(type, keyId, "[" + depot.getId().toString() + "]"); + } catch (DataAccessException e) { + logger.error(">>>>>>>>>>>>>>>>>查询用户对应的仓库:类型" + type + " KeyId为: " + keyId + " 存在异常!"); + } + if (flag == true) { + item.put("id", depot.getId()); + item.put("depotName", depot.getName()); + arr.add(item); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return arr; + } + + /** + * 查找礼品卡-虚拟仓库 + * @param type + * @param request + * @return + */ + @RequestMapping(value = "/findGiftByType") + public JSONArray findGiftByType(@RequestParam("type") Integer type, + HttpServletRequest request) { + JSONArray arr = new JSONArray(); + try { + List dataList = depotService.findGiftByType(type); + //存放数据json数组 + if (null != dataList) { + for (Depot depot : dataList) { + JSONObject item = new JSONObject(); + item.put("id", depot.getId()); + //仓库名称 + item.put("name", depot.getName()); + arr.add(item); + } + } + } catch (Exception e) { + logger.error(">>>>>>>>>查找仓库信息异常", e); + } + return arr; + } +} diff --git a/src/main/java/com/jsh/erp/controller/DepotHeadController.java b/src/main/java/com/jsh/erp/controller/DepotHeadController.java index 28e21a2d..f0e8d2e9 100644 --- a/src/main/java/com/jsh/erp/controller/DepotHeadController.java +++ b/src/main/java/com/jsh/erp/controller/DepotHeadController.java @@ -2,6 +2,7 @@ package com.jsh.erp.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.jsh.erp.constants.ExceptionConstants; import com.jsh.erp.datasource.entities.DepotHead; import com.jsh.erp.datasource.vo.DepotHeadVo4InDetail; import com.jsh.erp.datasource.vo.DepotHeadVo4InOutMCount; @@ -464,5 +465,75 @@ public class DepotHeadController { } return allMoney; } + /** + * create by: cjl + * description: + * 新增单据主表及单据子表信息 + * create time: 2019/1/25 14:36 + * @Param: beanJson +  * @Param: inserted +  * @Param: deleted +  * @Param: updated + * @return java.lang.String + */ + @RequestMapping(value = "/addDepotHeadAndDetail") + public Object addDepotHeadAndDetail(@RequestParam("info") String beanJson,@RequestParam("inserted") String inserted, + @RequestParam("deleted") String deleted, + @RequestParam("updated") String updated) throws Exception{ + JSONObject result = ExceptionConstants.standardSuccess(); + depotHeadService.addDepotHeadAndDetail(beanJson,inserted,deleted,updated); + return result; + } + /** + * create by: cjl + * description: + * 更新单据主表及单据子表信息 + * create time: 2019/1/28 14:47 + * @Param: id +  * @Param: beanJson +  * @Param: inserted +  * @Param: deleted +  * @Param: updated +  * @Param: preTotalPrice + * @return java.lang.Object + */ + @RequestMapping(value = "/updateDepotHeadAndDetail") + public Object updateDepotHeadAndDetail(@RequestParam("id") Long id,@RequestParam("info") String beanJson,@RequestParam("inserted") String inserted, + @RequestParam("deleted") String deleted, + @RequestParam("updated") String updated,@RequestParam("preTotalPrice") BigDecimal preTotalPrice) throws Exception{ + JSONObject result = ExceptionConstants.standardSuccess(); + depotHeadService.updateDepotHeadAndDetail(id,beanJson,inserted,deleted,updated,preTotalPrice); + return result; + } + /** + * create by: cjl + * description: + * 删除单据主表及子表信息 + * create time: 2019/1/28 17:29 + * @Param: id + * @return java.lang.Object + */ + @RequestMapping(value = "/deleteDepotHeadAndDetail") + public Object deleteDepotHeadAndDetail(@RequestParam("id") Long id) throws Exception{ + + JSONObject result = ExceptionConstants.standardSuccess(); + depotHeadService.deleteDepotHeadAndDetail(id); + return result; + } + /** + * create by: cjl + * description: + * 删除单据主表及子表信息 + * create time: 2019/1/28 17:29 + * @Param: id + * @return java.lang.Object + */ + @RequestMapping(value = "/batchDeleteDepotHeadAndDetail") + public Object batchDeleteDepotHeadAndDetail(@RequestParam("ids") String ids) throws Exception{ + + JSONObject result = ExceptionConstants.standardSuccess(); + depotHeadService.batchDeleteDepotHeadAndDetail(ids); + return result; + } } diff --git a/src/main/java/com/jsh/erp/controller/DepotItemController.java b/src/main/java/com/jsh/erp/controller/DepotItemController.java index 16c776e2..99aedefc 100644 --- a/src/main/java/com/jsh/erp/controller/DepotItemController.java +++ b/src/main/java/com/jsh/erp/controller/DepotItemController.java @@ -262,7 +262,7 @@ public class DepotItemController { @RequestParam("deleted") String deleted, @RequestParam("updated") String updated, @RequestParam("headerId") Long headerId, - HttpServletRequest request) { + HttpServletRequest request) throws Exception{ Map objectMap = new HashMap(); try { depotItemService.saveDetials(inserted,deleted,updated,headerId); diff --git a/src/main/java/com/jsh/erp/controller/SupplierController.java b/src/main/java/com/jsh/erp/controller/SupplierController.java index 81255fe7..e7b1e1ab 100644 --- a/src/main/java/com/jsh/erp/controller/SupplierController.java +++ b/src/main/java/com/jsh/erp/controller/SupplierController.java @@ -176,7 +176,12 @@ public class SupplierController { item.put("AdvanceIn", supplier.getAdvancein()); item.put("BeginNeedGet", supplier.getBeginneedget()); item.put("BeginNeedPay", supplier.getBeginneedpay()); - item.put("isystem", supplier.getIsystem() == (short) 0 ? "是" : "否"); + /** + * 2018-01-28这里会有空指针异常 + * */ + if(supplier.getIsystem()!=null){ + item.put("isystem", supplier.getIsystem() == (short) 0 ? "是" : "否"); + } item.put("description", supplier.getDescription()); item.put("fax", supplier.getFax()); item.put("telephone", supplier.getTelephone()); diff --git a/src/main/java/com/jsh/erp/datasource/entities/Material.java b/src/main/java/com/jsh/erp/datasource/entities/Material.java index f21c6adf..e7d2f0f1 100644 --- a/src/main/java/com/jsh/erp/datasource/entities/Material.java +++ b/src/main/java/com/jsh/erp/datasource/entities/Material.java @@ -190,7 +190,7 @@ public class Material { * 2019-01-21新增字段enableSerialNumber *是否开启序列号 * */ - private Boolean enableSerialNumber; + private String enableSerialNumber; /** * This method was generated by MyBatis Generator. @@ -744,11 +744,11 @@ public class Material { this.otherfield3 = otherfield3 == null ? null : otherfield3.trim(); } - public Boolean getEnableSerialNumber() { + public String getEnableSerialNumber() { return enableSerialNumber; } - public void setEnableSerialNumber(Boolean enableSerialNumber) { + public void setEnableSerialNumber(String enableSerialNumber) { this.enableSerialNumber = enableSerialNumber; } } \ No newline at end of file diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialExample.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialExample.java index f962828e..e74d0a68 100644 --- a/src/main/java/com/jsh/erp/datasource/entities/MaterialExample.java +++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialExample.java @@ -1704,6 +1704,72 @@ public class MaterialExample { addCriterion("OtherField3 not between", value1, value2, "otherfield3"); return (Criteria) this; } + public Criteria andEnableSerialNumberIsNull() { + addCriterion("enableSerialNumber is null"); + return (Criteria) this; + } + + public Criteria andEnableSerialNumberIsNotNull() { + addCriterion("enableSerialNumber is not null"); + return (Criteria) this; + } + + public Criteria andEnableSerialNumberEqualTo(String value) { + addCriterion("enableSerialNumber =", value, "enableSerialNumber"); + return (Criteria) this; + } + + public Criteria andEnableSerialNumberNotEqualTo(String value) { + addCriterion("enableSerialNumber <>", value, "enableSerialNumber"); + return (Criteria) this; + } + + public Criteria andEnableSerialNumberGreaterThan(String value) { + addCriterion("enableSerialNumber >", value, "enableSerialNumber"); + return (Criteria) this; + } + + public Criteria andEnableSerialNumberGreaterThanOrEqualTo(String value) { + addCriterion("enableSerialNumber >=", value, "enableSerialNumber"); + return (Criteria) this; + } + + public Criteria andEnableSerialNumberLessThan(String value) { + addCriterion("enableSerialNumber <", value, "enableSerialNumber"); + return (Criteria) this; + } + + public Criteria andEnableSerialNumberLessThanOrEqualTo(String value) { + addCriterion("enableSerialNumber <=", value, "enableSerialNumber"); + return (Criteria) this; + } + public Criteria andEnableSerialNumberLike(String value) { + addCriterion("enableSerialNumber like", value, "enableSerialNumber"); + return (Criteria) this; + } + public Criteria andEnableSerialNumberNotLike(String value) { + addCriterion("enableSerialNumber not like", value, "enableSerialNumber"); + return (Criteria) this; + } + public Criteria andEnableSerialNumberIn(List values) { + addCriterion("enableSerialNumber in", values, "enableSerialNumber"); + return (Criteria) this; + } + + public Criteria andEnableSerialNumberNotIn(List values) { + addCriterion("enableSerialNumber not in", values, "enableSerialNumber"); + return (Criteria) this; + } + + public Criteria andEnableSerialNumberBetween(String value1, String value2) { + addCriterion("enableSerialNumber between", value1, value2, "enableSerialNumber"); + return (Criteria) this; + } + + public Criteria andEnableSerialNumberNotBetween(String value1, String value2) { + addCriterion("enableSerialNumber not between", value1, value2, "enableSerialNumber"); + return (Criteria) this; + } } /** diff --git a/src/main/java/com/jsh/erp/datasource/entities/MaterialVo4Unit.java b/src/main/java/com/jsh/erp/datasource/entities/MaterialVo4Unit.java index 521442a7..47101015 100644 --- a/src/main/java/com/jsh/erp/datasource/entities/MaterialVo4Unit.java +++ b/src/main/java/com/jsh/erp/datasource/entities/MaterialVo4Unit.java @@ -59,7 +59,7 @@ public class MaterialVo4Unit { * 2019-01-21新增字段enableSerialNumber *是否开启序列号 * */ - private Boolean enableSerialNumber; + private String enableSerialNumber; public Long getId() { return id; @@ -269,11 +269,11 @@ public class MaterialVo4Unit { this.materialOther = materialOther; } - public Boolean getEnableSerialNumber() { + public String getEnableSerialNumber() { return enableSerialNumber; } - public void setEnableSerialNumber(Boolean enableSerialNumber) { + public void setEnableSerialNumber(String enableSerialNumber) { this.enableSerialNumber = enableSerialNumber; } } \ No newline at end of file diff --git a/src/main/java/com/jsh/erp/datasource/entities/SerialNumber.java b/src/main/java/com/jsh/erp/datasource/entities/SerialNumber.java index 63b14de6..e00648cc 100644 --- a/src/main/java/com/jsh/erp/datasource/entities/SerialNumber.java +++ b/src/main/java/com/jsh/erp/datasource/entities/SerialNumber.java @@ -33,7 +33,7 @@ public class SerialNumber { * * @mbggenerated */ - private Boolean isSell; + private String isSell; /** * This field was generated by MyBatis Generator. @@ -49,7 +49,7 @@ public class SerialNumber { * * @mbggenerated */ - private Boolean deleteFlag; + private String deleteFlag; /** * This field was generated by MyBatis Generator. @@ -82,6 +82,10 @@ public class SerialNumber { * @mbggenerated */ private Long updater; + /** + * 单据主表id,用于跟踪序列号流向 + * */ + private Long depotheadId; /** * This method was generated by MyBatis Generator. @@ -163,7 +167,7 @@ public class SerialNumber { * * @mbggenerated */ - public Boolean getIsSell() { + public String getIsSell() { return isSell; } @@ -175,7 +179,7 @@ public class SerialNumber { * * @mbggenerated */ - public void setIsSell(Boolean isSell) { + public void setIsSell(String isSell) { this.isSell = isSell; } @@ -211,7 +215,7 @@ public class SerialNumber { * * @mbggenerated */ - public Boolean getDeleteFlag() { + public String getDeleteFlag() { return deleteFlag; } @@ -223,7 +227,7 @@ public class SerialNumber { * * @mbggenerated */ - public void setDeleteFlag(Boolean deleteFlag) { + public void setDeleteFlag(String deleteFlag) { this.deleteFlag = deleteFlag; } @@ -322,4 +326,13 @@ public class SerialNumber { public void setUpdater(Long updater) { this.updater = updater; } + + + public Long getDepotheadId() { + return depotheadId; + } + + public void setDepotheadId(Long depotheadId) { + this.depotheadId = depotheadId; + } } \ No newline at end of file diff --git a/src/main/java/com/jsh/erp/datasource/entities/SerialNumberExample.java b/src/main/java/com/jsh/erp/datasource/entities/SerialNumberExample.java index 10abeed2..33006783 100644 --- a/src/main/java/com/jsh/erp/datasource/entities/SerialNumberExample.java +++ b/src/main/java/com/jsh/erp/datasource/entities/SerialNumberExample.java @@ -395,52 +395,61 @@ public class SerialNumberExample { return (Criteria) this; } - public Criteria andIsSellEqualTo(Boolean value) { + public Criteria andIsSellEqualTo(String value) { addCriterion("is_Sell =", value, "isSell"); return (Criteria) this; } - public Criteria andIsSellNotEqualTo(Boolean value) { + public Criteria andIsSellNotEqualTo(String value) { addCriterion("is_Sell <>", value, "isSell"); return (Criteria) this; } - public Criteria andIsSellGreaterThan(Boolean value) { + public Criteria andIsSellGreaterThan(String value) { addCriterion("is_Sell >", value, "isSell"); return (Criteria) this; } - public Criteria andIsSellGreaterThanOrEqualTo(Boolean value) { + public Criteria andIsSellGreaterThanOrEqualTo(String value) { addCriterion("is_Sell >=", value, "isSell"); return (Criteria) this; } - public Criteria andIsSellLessThan(Boolean value) { + public Criteria andIsSellLessThan(String value) { addCriterion("is_Sell <", value, "isSell"); return (Criteria) this; } - public Criteria andIsSellLessThanOrEqualTo(Boolean value) { + public Criteria andIsSellLessThanOrEqualTo(String value) { addCriterion("is_Sell <=", value, "isSell"); return (Criteria) this; } - public Criteria andIsSellIn(List values) { + public Criteria andIsSellLike(String value) { + addCriterion("isSell like", value, "isSell"); + return (Criteria) this; + } + public Criteria andIsSellNotLike(String value) { + addCriterion("isSell not like", value, "isSell"); + return (Criteria) this; + } + + public Criteria andIsSellIn(List values) { addCriterion("is_Sell in", values, "isSell"); return (Criteria) this; } - public Criteria andIsSellNotIn(List values) { + public Criteria andIsSellNotIn(List values) { addCriterion("is_Sell not in", values, "isSell"); return (Criteria) this; } - public Criteria andIsSellBetween(Boolean value1, Boolean value2) { + public Criteria andIsSellBetween(String value1, String value2) { addCriterion("is_Sell between", value1, value2, "isSell"); return (Criteria) this; } - public Criteria andIsSellNotBetween(Boolean value1, Boolean value2) { + public Criteria andIsSellNotBetween(String value1, String value2) { addCriterion("is_Sell not between", value1, value2, "isSell"); return (Criteria) this; } @@ -525,52 +534,59 @@ public class SerialNumberExample { return (Criteria) this; } - public Criteria andDeleteFlagEqualTo(Boolean value) { + public Criteria andDeleteFlagEqualTo(String value) { addCriterion("delete_Flag =", value, "deleteFlag"); return (Criteria) this; } - public Criteria andDeleteFlagNotEqualTo(Boolean value) { + public Criteria andDeleteFlagNotEqualTo(String value) { addCriterion("delete_Flag <>", value, "deleteFlag"); return (Criteria) this; } - public Criteria andDeleteFlagGreaterThan(Boolean value) { + public Criteria andDeleteFlagGreaterThan(String value) { addCriterion("delete_Flag >", value, "deleteFlag"); return (Criteria) this; } - public Criteria andDeleteFlagGreaterThanOrEqualTo(Boolean value) { + public Criteria andDeleteFlagGreaterThanOrEqualTo(String value) { addCriterion("delete_Flag >=", value, "deleteFlag"); return (Criteria) this; } - public Criteria andDeleteFlagLessThan(Boolean value) { + public Criteria andDeleteFlagLessThan(String value) { addCriterion("delete_Flag <", value, "deleteFlag"); return (Criteria) this; } - public Criteria andDeleteFlagLessThanOrEqualTo(Boolean value) { + public Criteria andDeleteFlagLessThanOrEqualTo(String value) { addCriterion("delete_Flag <=", value, "deleteFlag"); return (Criteria) this; } - - public Criteria andDeleteFlagIn(List values) { + public Criteria andDeleteFlagLike(String value) { + addCriterion("deleteFlag like", value, "deleteFlag"); + return (Criteria) this; + } + public Criteria andDeleteFlagNotLike(String value) { + addCriterion("deleteFlag not like", value, "deleteFlag"); + return (Criteria) this; + } + public Criteria andDeleteFlagIn(List values) { addCriterion("delete_Flag in", values, "deleteFlag"); return (Criteria) this; } - public Criteria andDeleteFlagNotIn(List values) { + public Criteria andDeleteFlagNotIn(List values) { addCriterion("delete_Flag not in", values, "deleteFlag"); return (Criteria) this; } - public Criteria andDeleteFlagBetween(Boolean value1, Boolean value2) { + public Criteria andDeleteFlagBetween(String value1, String value2) { addCriterion("delete_Flag between", value1, value2, "deleteFlag"); return (Criteria) this; } - public Criteria andDeleteFlagNotBetween(Boolean value1, Boolean value2) { + public Criteria andDeleteFlagNotBetween(String value1, String value2) { addCriterion("delete_Flag not between", value1, value2, "deleteFlag"); return (Criteria) this; } @@ -814,6 +830,68 @@ public class SerialNumberExample { addCriterion("updater not between", value1, value2, "updater"); return (Criteria) this; } + public Criteria andDepotheadIdIsNull() { + addCriterion("depotheadId is null"); + return (Criteria) this; + } + + public Criteria andDepotheadIdIsNotNull() { + addCriterion("depotheadId is not null"); + return (Criteria) this; + } + + public Criteria andDepotheadIdEqualTo(Long value) { + addCriterion("depotheadId =", value, "depotheadId"); + return (Criteria) this; + } + + public Criteria andDepotheadIdNotEqualTo(Long value) { + addCriterion("depotheadId <>", value, "depotheadId"); + return (Criteria) this; + } + + public Criteria andDepotheadIdGreaterThan(Long value) { + addCriterion("depotheadId >", value, "depotheadId"); + return (Criteria) this; + } + + public Criteria andDepotheadIdGreaterThanOrEqualTo(Long value) { + addCriterion("depotheadId >=", value, "depotheadId"); + return (Criteria) this; + } + + public Criteria andDepotheadIdLessThan(Long value) { + addCriterion("depotheadId <", value, "depotheadId"); + return (Criteria) this; + } + + public Criteria andDepotheadIdLessThanOrEqualTo(Long value) { + addCriterion("depotheadId <=", value, "depotheadId"); + return (Criteria) this; + } + + public Criteria andDepotheadIdIn(List values) { + addCriterion("depotheadId in", values, "depotheadId"); + return (Criteria) this; + } + + public Criteria andDepotheadIdNotIn(List values) { + addCriterion("depotheadId not in", values, "depotheadId"); + return (Criteria) this; + } + + public Criteria andDepotheadIdBetween(Long value1, Long value2) { + addCriterion("depotheadId between", value1, value2, "depotheadId"); + return (Criteria) this; + } + + public Criteria andDepotheadIdNotBetween(Long value1, Long value2) { + addCriterion("depotheadId not between", value1, value2, "depotheadId"); + return (Criteria) this; + } + + + } /** diff --git a/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapper.java index 3d620fac..73f99835 100644 --- a/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapper.java +++ b/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapper.java @@ -101,87 +101,6 @@ public interface DepotHeadMapper { */ int updateByPrimaryKey(DepotHead record); - List selectByConditionDepotHead( - @Param("type") String type, - @Param("subType") String subType, - @Param("number") String number, - @Param("beginTime") String beginTime, - @Param("endTime") String endTime, - @Param("dhIds") String dhIds, - @Param("offset") Integer offset, - @Param("rows") Integer rows); - int countsByDepotHead( - @Param("type") String type, - @Param("subType") String subType, - @Param("number") String number, - @Param("beginTime") String beginTime, - @Param("endTime") String endTime, - @Param("dhIds") String dhIds); - - Long getMaxId(); - - String findMaterialsListByHeaderId( - @Param("id") Long id); - - List findByAll( - @Param("beginTime") String beginTime, - @Param("endTime") String endTime, - @Param("type") String type, - @Param("pid") Integer pid, - @Param("dids") String dids, - @Param("oId") Integer oId, - @Param("offset") Integer offset, - @Param("rows") Integer rows); - - int findByAllCount( - @Param("beginTime") String beginTime, - @Param("endTime") String endTime, - @Param("type") String type, - @Param("pid") Integer pid, - @Param("dids") String dids, - @Param("oId") Integer oId); - - List findInOutMaterialCount( - @Param("beginTime") String beginTime, - @Param("endTime") String endTime, - @Param("type") String type, - @Param("pid") Integer pid, - @Param("dids") String dids, - @Param("oId") Integer oId, - @Param("offset") Integer offset, - @Param("rows") Integer rows); - - int findInOutMaterialCountTotal( - @Param("beginTime") String beginTime, - @Param("endTime") String endTime, - @Param("type") String type, - @Param("pid") Integer pid, - @Param("dids") String dids, - @Param("oId") Integer oId); - - List findStatementAccount( - @Param("beginTime") String beginTime, - @Param("endTime") String endTime, - @Param("organId") Integer organId, - @Param("supType") String supType, - @Param("offset") Integer offset, - @Param("rows") Integer rows); - - int findStatementAccountCount( - @Param("beginTime") String beginTime, - @Param("endTime") String endTime, - @Param("organId") Integer organId, - @Param("supType") String supType); - - BigDecimal findAllMoney( - @Param("supplierId") Integer supplierId, - @Param("type") String type, - @Param("subType") String subType, - @Param("modeName") String modeName, - @Param("endTime") String endTime); - - List getDetailByNumber( - @Param("number") String number); } \ No newline at end of file diff --git a/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapperEx.java new file mode 100644 index 00000000..4e5faaa1 --- /dev/null +++ b/src/main/java/com/jsh/erp/datasource/mappers/DepotHeadMapperEx.java @@ -0,0 +1,110 @@ +package com.jsh.erp.datasource.mappers; + +import com.jsh.erp.datasource.entities.DepotHead; +import com.jsh.erp.datasource.vo.DepotHeadVo4InDetail; +import com.jsh.erp.datasource.vo.DepotHeadVo4InOutMCount; +import com.jsh.erp.datasource.vo.DepotHeadVo4List; +import com.jsh.erp.datasource.vo.DepotHeadVo4StatementAccount; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; + +/** + * Description + * + * @Author: cjl + * @Date: 2019/1/25 14:50 + */ +public interface DepotHeadMapperEx { + List selectByConditionDepotHead( + @Param("type") String type, + @Param("subType") String subType, + @Param("number") String number, + @Param("beginTime") String beginTime, + @Param("endTime") String endTime, + @Param("dhIds") String dhIds, + @Param("offset") Integer offset, + @Param("rows") Integer rows); + + int countsByDepotHead( + @Param("type") String type, + @Param("subType") String subType, + @Param("number") String number, + @Param("beginTime") String beginTime, + @Param("endTime") String endTime, + @Param("dhIds") String dhIds); + + Long getMaxId(); + + String findMaterialsListByHeaderId( + @Param("id") Long id); + + List findByAll( + @Param("beginTime") String beginTime, + @Param("endTime") String endTime, + @Param("type") String type, + @Param("pid") Integer pid, + @Param("dids") String dids, + @Param("oId") Integer oId, + @Param("offset") Integer offset, + @Param("rows") Integer rows); + + int findByAllCount( + @Param("beginTime") String beginTime, + @Param("endTime") String endTime, + @Param("type") String type, + @Param("pid") Integer pid, + @Param("dids") String dids, + @Param("oId") Integer oId); + + List findInOutMaterialCount( + @Param("beginTime") String beginTime, + @Param("endTime") String endTime, + @Param("type") String type, + @Param("pid") Integer pid, + @Param("dids") String dids, + @Param("oId") Integer oId, + @Param("offset") Integer offset, + @Param("rows") Integer rows); + + int findInOutMaterialCountTotal( + @Param("beginTime") String beginTime, + @Param("endTime") String endTime, + @Param("type") String type, + @Param("pid") Integer pid, + @Param("dids") String dids, + @Param("oId") Integer oId); + + List findStatementAccount( + @Param("beginTime") String beginTime, + @Param("endTime") String endTime, + @Param("organId") Integer organId, + @Param("supType") String supType, + @Param("offset") Integer offset, + @Param("rows") Integer rows); + + int findStatementAccountCount( + @Param("beginTime") String beginTime, + @Param("endTime") String endTime, + @Param("organId") Integer organId, + @Param("supType") String supType); + + BigDecimal findAllMoney( + @Param("supplierId") Integer supplierId, + @Param("type") String type, + @Param("subType") String subType, + @Param("modeName") String modeName, + @Param("endTime") String endTime); + + List getDetailByNumber( + @Param("number") String number); + /** + * 新增单据主表信息,并反显单据主表id + * */ + int adddepotHead(DepotHead depotHead); + /** + * 更新单据主表信息 + * */ + void updatedepotHead(DepotHead depotHead); +} diff --git a/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapper.java index 1ff4939f..484f0293 100644 --- a/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapper.java +++ b/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapper.java @@ -96,123 +96,6 @@ public interface DepotItemMapper { */ int updateByPrimaryKey(DepotItem record); - List selectByConditionDepotItem( - @Param("name") String name, - @Param("type") Integer type, - @Param("remark") String remark, - @Param("offset") Integer offset, - @Param("rows") Integer rows); - int countsByDepotItem( - @Param("name") String name, - @Param("type") Integer type, - @Param("remark") String remark); - - List getHeaderIdByMaterial( - @Param("materialParam") String materialParam, - @Param("depotIds") String depotIds); - - List findDetailByTypeAndMaterialIdList( - @Param("mId") Long mId, - @Param("offset") Integer offset, - @Param("rows") Integer rows); - - int findDetailByTypeAndMaterialIdCounts( - @Param("mId") Long mId); - - List findStockNumByMaterialIdList( - @Param("mId") Long mId, - @Param("monthTime") String monthTime, - @Param("offset") Integer offset, - @Param("rows") Integer rows); - - int findStockNumByMaterialIdCounts( - @Param("mId") Long mId, - @Param("monthTime") String monthTime); - - int findByTypeAndMaterialIdIn( - @Param("mId") Long mId); - - int findByTypeAndMaterialIdOut( - @Param("mId") Long mId); - - List getDetailList( - @Param("headerId") Long headerId); - - List findByAll( - @Param("headIds") String headIds, - @Param("materialIds") String materialIds, - @Param("offset") Integer offset, - @Param("rows") Integer rows); - - int findByAllCount( - @Param("headIds") String headIds, - @Param("materialIds") String materialIds); - - BigDecimal findByTypeInIsPrev( - @Param("ProjectId") Integer ProjectId, - @Param("MId") Long MId, - @Param("MonthTime") String MonthTime); - - BigDecimal findByTypeInIsNotPrev( - @Param("ProjectId") Integer ProjectId, - @Param("MId") Long MId, - @Param("MonthTime") String MonthTime); - - BigDecimal findByTypeOutIsPrev( - @Param("ProjectId") Integer ProjectId, - @Param("MId") Long MId, - @Param("MonthTime") String MonthTime); - - BigDecimal findByTypeOutIsNotPrev( - @Param("ProjectId") Integer ProjectId, - @Param("MId") Long MId, - @Param("MonthTime") String MonthTime); - - - - BigDecimal findPriceByTypeInIsPrev( - @Param("ProjectId") Integer ProjectId, - @Param("MId") Long MId, - @Param("MonthTime") String MonthTime); - - BigDecimal findPriceByTypeInIsNotPrev( - @Param("ProjectId") Integer ProjectId, - @Param("MId") Long MId, - @Param("MonthTime") String MonthTime); - - BigDecimal findPriceByTypeOutIsPrev( - @Param("ProjectId") Integer ProjectId, - @Param("MId") Long MId, - @Param("MonthTime") String MonthTime); - - BigDecimal findPriceByTypeOutIsNotPrev( - @Param("ProjectId") Integer ProjectId, - @Param("MId") Long MId, - @Param("MonthTime") String MonthTime); - - BigDecimal buyOrSaleNumber( - @Param("type") String type, - @Param("subType") String subType, - @Param("MId") Long MId, - @Param("MonthTime") String MonthTime, - @Param("sumType") String sumType); - - BigDecimal buyOrSalePrice( - @Param("type") String type, - @Param("subType") String subType, - @Param("MId") Long MId, - @Param("MonthTime") String MonthTime, - @Param("sumType") String sumType); - - BigDecimal findGiftByTypeIn( - @Param("subType") String subType, - @Param("ProjectId") Integer ProjectId, - @Param("MId") Long MId); - - BigDecimal findGiftByTypeOut( - @Param("subType") String subType, - @Param("ProjectId") Integer ProjectId, - @Param("MId") Long MId); } \ No newline at end of file diff --git a/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapperEx.java new file mode 100644 index 00000000..4c71049d --- /dev/null +++ b/src/main/java/com/jsh/erp/datasource/mappers/DepotItemMapperEx.java @@ -0,0 +1,148 @@ +package com.jsh.erp.datasource.mappers; + +import com.jsh.erp.datasource.entities.*; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; + +/** + * Description + * + * @Author: cjl + * @Date: 2019/1/24 16:59 + */ +public interface DepotItemMapperEx { + List selectByConditionDepotItem( + @Param("name") String name, + @Param("type") Integer type, + @Param("remark") String remark, + @Param("offset") Integer offset, + @Param("rows") Integer rows); + + int countsByDepotItem( + @Param("name") String name, + @Param("type") Integer type, + @Param("remark") String remark); + + List getHeaderIdByMaterial( + @Param("materialParam") String materialParam, + @Param("depotIds") String depotIds); + + List findDetailByTypeAndMaterialIdList( + @Param("mId") Long mId, + @Param("offset") Integer offset, + @Param("rows") Integer rows); + + int findDetailByTypeAndMaterialIdCounts( + @Param("mId") Long mId); + + List findStockNumByMaterialIdList( + @Param("mId") Long mId, + @Param("monthTime") String monthTime, + @Param("offset") Integer offset, + @Param("rows") Integer rows); + + int findStockNumByMaterialIdCounts( + @Param("mId") Long mId, + @Param("monthTime") String monthTime); + + int findByTypeAndMaterialIdIn( + @Param("mId") Long mId); + + int findByTypeAndMaterialIdOut( + @Param("mId") Long mId); + + List getDetailList( + @Param("headerId") Long headerId); + + List findByAll( + @Param("headIds") String headIds, + @Param("materialIds") String materialIds, + @Param("offset") Integer offset, + @Param("rows") Integer rows); + + int findByAllCount( + @Param("headIds") String headIds, + @Param("materialIds") String materialIds); + + BigDecimal findByTypeInIsPrev( + @Param("ProjectId") Integer ProjectId, + @Param("MId") Long MId, + @Param("MonthTime") String MonthTime); + + BigDecimal findByTypeInIsNotPrev( + @Param("ProjectId") Integer ProjectId, + @Param("MId") Long MId, + @Param("MonthTime") String MonthTime); + + BigDecimal findByTypeOutIsPrev( + @Param("ProjectId") Integer ProjectId, + @Param("MId") Long MId, + @Param("MonthTime") String MonthTime); + + BigDecimal findByTypeOutIsNotPrev( + @Param("ProjectId") Integer ProjectId, + @Param("MId") Long MId, + @Param("MonthTime") String MonthTime); + + + + BigDecimal findPriceByTypeInIsPrev( + @Param("ProjectId") Integer ProjectId, + @Param("MId") Long MId, + @Param("MonthTime") String MonthTime); + + BigDecimal findPriceByTypeInIsNotPrev( + @Param("ProjectId") Integer ProjectId, + @Param("MId") Long MId, + @Param("MonthTime") String MonthTime); + + BigDecimal findPriceByTypeOutIsPrev( + @Param("ProjectId") Integer ProjectId, + @Param("MId") Long MId, + @Param("MonthTime") String MonthTime); + + BigDecimal findPriceByTypeOutIsNotPrev( + @Param("ProjectId") Integer ProjectId, + @Param("MId") Long MId, + @Param("MonthTime") String MonthTime); + + BigDecimal buyOrSaleNumber( + @Param("type") String type, + @Param("subType") String subType, + @Param("MId") Long MId, + @Param("MonthTime") String MonthTime, + @Param("sumType") String sumType); + + BigDecimal buyOrSalePrice( + @Param("type") String type, + @Param("subType") String subType, + @Param("MId") Long MId, + @Param("MonthTime") String MonthTime, + @Param("sumType") String sumType); + + BigDecimal findGiftByTypeIn( + @Param("subType") String subType, + @Param("ProjectId") Integer ProjectId, + @Param("MId") Long MId); + + BigDecimal findGiftByTypeOut( + @Param("subType") String subType, + @Param("ProjectId") Integer ProjectId, + @Param("MId") Long MId); + /** + * create by: cjl + * description: + * 通过单据主表id查询所有单据子表数据 + * create time: 2019/1/24 16:56 + * @Param: depotheadId + * @return java.util.List + */ + List findDepotItemListBydepotheadId(@Param("depotheadId")Long depotheadId, + @Param("enableSerialNumber")String enableSerialNumber); + /** + * 根据单据主表id删除单据子表数据 + * */ + int deleteDepotItemByDepotHeadIds(@Param("depotheadIds")Long []depotHeadIds); +} diff --git a/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapperEx.java index b8b4276d..05621c9b 100644 --- a/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapperEx.java +++ b/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapperEx.java @@ -1,9 +1,9 @@ package com.jsh.erp.datasource.mappers; -import com.jsh.erp.datasource.entities.SerialNumber; import com.jsh.erp.datasource.entities.SerialNumberEx; import org.apache.ibatis.annotations.Param; +import java.util.Date; import java.util.List; /** @@ -42,4 +42,19 @@ public interface SerialNumberMapperEx { * 未删除为卖出的视为有效 * */ int findSerialNumberByMaterialId(@Param("materialId") Long materialId); + /** + * 查询符合条件的序列号数量 + * */ + int countSerialNumberByMaterialIdAndDepotheadId(@Param("materialId")Long materialId, @Param("depotheadId")Long depotheadId, @Param("isSell")String isSell); + /** + * 卖出: update jsh_serial_number set is_Sell='1' ,depothead_Id='depotheadId' where 1=1 and material_Id='materialId' + * and is_Sell !='1' and delete_Flag !='1' {limit 0,count} + * */ + int sellSerialNumber(@Param("materialId")Long materialId, @Param("depotheadId")Long depotheadId,@Param("count")Integer count, @Param("updateTime") Date updateTime,@Param("updater") Long updater); + /** + * 赎回:update jsh_serial_number set is_Sell='0' where 1=1 and material_Id='materialId' + * and depothead_Id='depotheadId' and is_Sell !='0' and delete_Flag !='1' {limit 0,count} + * */ + int cancelSerialNumber(@Param("materialId")Long materialId, @Param("depotheadId")Long depotheadId, @Param("count")Integer count, @Param("updateTime") Date updateTime,@Param("updater") Long updater); + } diff --git a/src/main/java/com/jsh/erp/service/depotHead/DepotHeadService.java b/src/main/java/com/jsh/erp/service/depotHead/DepotHeadService.java index 2c951165..d282c4bb 100644 --- a/src/main/java/com/jsh/erp/service/depotHead/DepotHeadService.java +++ b/src/main/java/com/jsh/erp/service/depotHead/DepotHeadService.java @@ -2,14 +2,22 @@ package com.jsh.erp.service.depotHead; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.jsh.erp.constants.BusinessConstants; import com.jsh.erp.datasource.entities.DepotHead; import com.jsh.erp.datasource.entities.DepotHeadExample; +import com.jsh.erp.datasource.entities.DepotItem; import com.jsh.erp.datasource.entities.User; import com.jsh.erp.datasource.mappers.DepotHeadMapper; +import com.jsh.erp.datasource.mappers.DepotHeadMapperEx; +import com.jsh.erp.datasource.mappers.DepotItemMapperEx; import com.jsh.erp.datasource.vo.DepotHeadVo4InDetail; import com.jsh.erp.datasource.vo.DepotHeadVo4InOutMCount; import com.jsh.erp.datasource.vo.DepotHeadVo4List; import com.jsh.erp.datasource.vo.DepotHeadVo4StatementAccount; +import com.jsh.erp.service.depotItem.DepotItemService; +import com.jsh.erp.service.serialNumber.SerialNumberService; +import com.jsh.erp.service.supplier.SupplierService; +import com.jsh.erp.service.user.UserService; import com.jsh.erp.utils.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,6 +41,19 @@ public class DepotHeadService { @Resource private DepotHeadMapper depotHeadMapper; + @Resource + private DepotHeadMapperEx depotHeadMapperEx; + @Resource + private UserService userService; + @Resource + DepotItemService depotItemService; + @Resource + private SupplierService supplierService; + @Resource + private SerialNumberService serialNumberService; + @Resource + DepotItemMapperEx depotItemMapperEx; + public DepotHead getDepotHead(long id) { return depotHeadMapper.selectByPrimaryKey(id); @@ -45,7 +66,7 @@ public class DepotHeadService { public List select(String type, String subType, String number, String beginTime, String endTime, String dhIds, int offset, int rows) { List resList = new ArrayList(); - List list = depotHeadMapper.selectByConditionDepotHead(type, subType, number, beginTime, endTime, dhIds, offset, rows); + List list = depotHeadMapperEx.selectByConditionDepotHead(type, subType, number, beginTime, endTime, dhIds, offset, rows); if (null != list) { for (DepotHeadVo4List dh : list) { if(dh.getOthermoneylist() != null) { @@ -73,7 +94,7 @@ public class DepotHeadService { public int countDepotHead(String type, String subType, String number, String beginTime, String endTime, String dhIds) { - return depotHeadMapper.countsByDepotHead(type, subType, number, beginTime, endTime, dhIds); + return depotHeadMapperEx.countsByDepotHead(type, subType, number, beginTime, endTime, dhIds); } @Transactional(value = "transactionManager", rollbackFor = Exception.class) @@ -169,11 +190,11 @@ public class DepotHeadService { } public Long getMaxId() { - return depotHeadMapper.getMaxId(); + return depotHeadMapperEx.getMaxId(); } public String findMaterialsListByHeaderId(Long id) { - String allReturn = depotHeadMapper.findMaterialsListByHeaderId(id); + String allReturn = depotHeadMapperEx.findMaterialsListByHeaderId(id); return allReturn; } @@ -194,27 +215,27 @@ public class DepotHeadService { } public List findByAll(String beginTime, String endTime, String type, Integer pid, String dids, Integer oId, Integer offset, Integer rows) { - return depotHeadMapper.findByAll(beginTime, endTime, type, pid, dids, oId, offset, rows); + return depotHeadMapperEx.findByAll(beginTime, endTime, type, pid, dids, oId, offset, rows); } public int findByAllCount(String beginTime, String endTime, String type, Integer pid, String dids, Integer oId) { - return depotHeadMapper.findByAllCount(beginTime, endTime, type, pid, dids, oId); + return depotHeadMapperEx.findByAllCount(beginTime, endTime, type, pid, dids, oId); } public List findInOutMaterialCount(String beginTime, String endTime, String type, Integer pid, String dids, Integer oId, Integer offset, Integer rows) { - return depotHeadMapper.findInOutMaterialCount(beginTime, endTime, type, pid, dids, oId, offset, rows); + return depotHeadMapperEx.findInOutMaterialCount(beginTime, endTime, type, pid, dids, oId, offset, rows); } public int findInOutMaterialCountTotal(String beginTime, String endTime, String type, Integer pid, String dids, Integer oId) { - return depotHeadMapper.findInOutMaterialCountTotal(beginTime, endTime, type, pid, dids, oId); + return depotHeadMapperEx.findInOutMaterialCountTotal(beginTime, endTime, type, pid, dids, oId); } public List findStatementAccount(String beginTime, String endTime, Integer organId, String supType, Integer offset, Integer rows) { - return depotHeadMapper.findStatementAccount(beginTime, endTime, organId, supType, offset, rows); + return depotHeadMapperEx.findStatementAccount(beginTime, endTime, organId, supType, offset, rows); } public int findStatementAccountCount(String beginTime, String endTime, Integer organId, String supType) { - return depotHeadMapper.findStatementAccountCount(beginTime, endTime, organId, supType); + return depotHeadMapperEx.findStatementAccountCount(beginTime, endTime, organId, supType); } public BigDecimal findAllMoney(Integer supplierId, String type, String subType, String mode, String endTime) { @@ -224,12 +245,12 @@ public class DepotHeadService { } else if (mode.equals("合计")) { modeName = "DiscountLastMoney"; } - return depotHeadMapper.findAllMoney(supplierId, type, subType, modeName, endTime); + return depotHeadMapperEx.findAllMoney(supplierId, type, subType, modeName, endTime); } public List getDetailByNumber(String number) { List resList = new ArrayList(); - List list = depotHeadMapper.getDetailByNumber(number); + List list = depotHeadMapperEx.getDetailByNumber(number); if (null != list) { for (DepotHeadVo4List dh : list) { if(dh.getOthermoneylist() != null) { @@ -254,4 +275,115 @@ public class DepotHeadService { return resList; } + /** + * create by: cjl + * description: + * 新增单据主表及单据子表信息 + * create time: 2019/1/25 14:36 + * @Param: beanJson +  * @Param: inserted +  * @Param: deleted +  * @Param: updated + * @return java.lang.String + */ + @Transactional(value = "transactionManager", rollbackFor = Exception.class) + public void addDepotHeadAndDetail(String beanJson, String inserted, String deleted, String updated) throws Exception { + /**处理单据主表数据*/ + DepotHead depotHead = JSONObject.parseObject(beanJson, DepotHead.class); + //判断用户是否已经登录过,登录过不再处理 + User userInfo=userService.getCurrentUser(); + depotHead.setOperpersonname(userInfo==null?null:userInfo.getUsername()); + depotHead.setCreatetime(new Timestamp(System.currentTimeMillis())); + depotHead.setStatus(false); + depotHeadMapperEx.adddepotHead(depotHead); + + /**入库和出库处理预付款信息*/ + if(BusinessConstants.PAY_TYPE_PREPAID.equals(depotHead.getPaytype())){ + if(depotHead.getOrganid()!=null) { + supplierService.updateAdvanceIn(depotHead.getOrganid(), BigDecimal.ZERO.subtract(depotHead.getTotalprice())); + } + } + /**入库和出库处理单据子表信息*/ + depotItemService.saveDetials(inserted,deleted,updated,depotHead.getId()); + } + /** + * create by: cjl + * description: + * 更新单据主表及单据子表信息 + * create time: 2019/1/28 14:47 + * @Param: id +  * @Param: beanJson +  * @Param: inserted +  * @Param: deleted +  * @Param: updated +  * @Param: preTotalPrice + * @return java.lang.Object + */ + @Transactional(value = "transactionManager", rollbackFor = Exception.class) + public void updateDepotHeadAndDetail(Long id, String beanJson, String inserted, String deleted, String updated, BigDecimal preTotalPrice)throws Exception { + /**更新单据主表信息*/ + DepotHead depotHead = JSONObject.parseObject(beanJson, DepotHead.class); + //判断用户是否已经登录过,登录过不再处理 + depotHead.setId(id); + User userInfo=userService.getCurrentUser(); + depotHead.setOperpersonname(userInfo==null?null:userInfo.getUsername()); + depotHead.setOpertime(new Timestamp(System.currentTimeMillis())); + depotHeadMapperEx.updatedepotHead(depotHead); + /**入库和出库处理预付款信息*/ + if(BusinessConstants.PAY_TYPE_PREPAID.equals(depotHead.getPaytype())){ + if(depotHead.getOrganid()!=null){ + supplierService.updateAdvanceIn(depotHead.getOrganid(), BigDecimal.ZERO.subtract(depotHead.getTotalprice().subtract(preTotalPrice))); + } + } + /**入库和出库处理单据子表信息*/ + depotItemService.saveDetials(inserted,deleted,updated,depotHead.getId()); + } + + /** + * create by: cjl + * description: + * 删除单据主表及子表信息 + * create time: 2019/1/28 17:29 + * @Param: id + * @return java.lang.Object + */ + @Transactional(value = "transactionManager", rollbackFor = Exception.class) + public void deleteDepotHeadAndDetail(Long id) throws Exception { + //查询单据主表信息 + DepotHead depotHead =getDepotHead(id); + User userInfo=userService.getCurrentUser(); + //删除出库数据回收序列号 + if(BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType()) + &&!BusinessConstants.SUB_TYPE_TRANSFER.equals(depotHead.getSubtype())){ + //查询单据子表列表 + List depotItemList = depotItemMapperEx.findDepotItemListBydepotheadId(id,BusinessConstants.ENABLE_SERIAL_NUMBER_ENABLED); + /**回收序列号*/ + if(depotItemList!=null&&depotItemList.size()>0){ + for(DepotItem depotItem:depotItemList){ + serialNumberService.cancelSerialNumber(depotItem.getMaterialid(), depotItem.getHeaderid(),depotItem.getOpernumber().intValue(),userInfo); + } + } + } + /**删除单据子表数据*/ + depotItemMapperEx.deleteDepotItemByDepotHeadIds(new Long []{id}); + /**删除单据主表信息*/ + deleteDepotHead(id); + } + /** + * create by: cjl + * description: + * 批量删除单据主表及子表信息 + * create time: 2019/1/28 17:29 + * @Param: id + * @return java.lang.Object + */ + @Transactional(value = "transactionManager", rollbackFor = Exception.class) + public void batchDeleteDepotHeadAndDetail(String ids) throws Exception{ + if(StringUtil.isNotEmpty(ids)){ + String [] headIds=ids.split(","); + for(int i=0;i select(String name, Integer type, String remark, int offset, int rows) { - return depotItemMapper.selectByConditionDepotItem(name, type, remark, offset, rows); + return depotItemMapperEx.selectByConditionDepotItem(name, type, remark, offset, rows); } public int countDepotItem(String name, Integer type, String remark) { - return depotItemMapper.countsByDepotItem(name, type, remark); + return depotItemMapperEx.countsByDepotItem(name, type, remark); } @Transactional(value = "transactionManager", rollbackFor = Exception.class) @@ -87,7 +104,7 @@ public class DepotItemService { } public List getHeaderIdByMaterial(String materialParam, String depotIds) { - return depotItemMapper.getHeaderIdByMaterial(materialParam, depotIds); + return depotItemMapperEx.getHeaderIdByMaterial(materialParam, depotIds); } public List findDetailByTypeAndMaterialIdList(Map map) { @@ -96,7 +113,7 @@ public class DepotItemService { if(!StringUtil.isEmpty(mIdStr)) { mId = Long.parseLong(mIdStr); } - return depotItemMapper.findDetailByTypeAndMaterialIdList(mId, QueryUtils.offset(map), QueryUtils.rows(map)); + return depotItemMapperEx.findDetailByTypeAndMaterialIdList(mId, QueryUtils.offset(map), QueryUtils.rows(map)); } public int findDetailByTypeAndMaterialIdCounts(Map map) { @@ -105,7 +122,7 @@ public class DepotItemService { if(!StringUtil.isEmpty(mIdStr)) { mId = Long.parseLong(mIdStr); } - return depotItemMapper.findDetailByTypeAndMaterialIdCounts(mId); + return depotItemMapperEx.findDetailByTypeAndMaterialIdCounts(mId); } public List findStockNumByMaterialIdList(Map map) { @@ -115,7 +132,7 @@ public class DepotItemService { mId = Long.parseLong(mIdStr); } String monthTime = map.get("monthTime"); - return depotItemMapper.findStockNumByMaterialIdList(mId, monthTime, QueryUtils.offset(map), QueryUtils.rows(map)); + return depotItemMapperEx.findStockNumByMaterialIdList(mId, monthTime, QueryUtils.offset(map), QueryUtils.rows(map)); } public int findStockNumByMaterialIdCounts(Map map) { @@ -125,7 +142,7 @@ public class DepotItemService { mId = Long.parseLong(mIdStr); } String monthTime = map.get("monthTime"); - return depotItemMapper.findStockNumByMaterialIdCounts(mId, monthTime); + return depotItemMapperEx.findStockNumByMaterialIdCounts(mId, monthTime); } @Transactional(value = "transactionManager", rollbackFor = Exception.class) @@ -140,36 +157,36 @@ public class DepotItemService { public int findByTypeAndMaterialId(String type, Long mId) { if(type.equals(TYPE)) { - return depotItemMapper.findByTypeAndMaterialIdIn(mId); + return depotItemMapperEx.findByTypeAndMaterialIdIn(mId); } else { - return depotItemMapper.findByTypeAndMaterialIdOut(mId); + return depotItemMapperEx.findByTypeAndMaterialIdOut(mId); } } public List getDetailList(Long headerId) { - return depotItemMapper.getDetailList(headerId); + return depotItemMapperEx.getDetailList(headerId); } public List findByAll(String headIds, String materialIds, Integer offset, Integer rows) { - return depotItemMapper.findByAll(headIds, materialIds, offset, rows); + return depotItemMapperEx.findByAll(headIds, materialIds, offset, rows); } public int findByAllCount(String headIds, String materialIds) { - return depotItemMapper.findByAllCount(headIds, materialIds); + return depotItemMapperEx.findByAllCount(headIds, materialIds); } public BigDecimal findByType(String type, Integer ProjectId, Long MId, String MonthTime, Boolean isPrev) { if (TYPE.equals(type)) { if (isPrev) { - return depotItemMapper.findByTypeInIsPrev(ProjectId, MId, MonthTime); + return depotItemMapperEx.findByTypeInIsPrev(ProjectId, MId, MonthTime); } else { - return depotItemMapper.findByTypeInIsNotPrev(ProjectId, MId, MonthTime); + return depotItemMapperEx.findByTypeInIsNotPrev(ProjectId, MId, MonthTime); } } else { if (isPrev) { - return depotItemMapper.findByTypeOutIsPrev(ProjectId, MId, MonthTime); + return depotItemMapperEx.findByTypeOutIsPrev(ProjectId, MId, MonthTime); } else { - return depotItemMapper.findByTypeOutIsNotPrev(ProjectId, MId, MonthTime); + return depotItemMapperEx.findByTypeOutIsNotPrev(ProjectId, MId, MonthTime); } } } @@ -177,41 +194,64 @@ public class DepotItemService { public BigDecimal findPriceByType(String type, Integer ProjectId, Long MId, String MonthTime, Boolean isPrev) { if (TYPE.equals(type)) { if (isPrev) { - return depotItemMapper.findPriceByTypeInIsPrev(ProjectId, MId, MonthTime); + return depotItemMapperEx.findPriceByTypeInIsPrev(ProjectId, MId, MonthTime); } else { - return depotItemMapper.findPriceByTypeInIsNotPrev(ProjectId, MId, MonthTime); + return depotItemMapperEx.findPriceByTypeInIsNotPrev(ProjectId, MId, MonthTime); } } else { if (isPrev) { - return depotItemMapper.findPriceByTypeOutIsPrev(ProjectId, MId, MonthTime); + return depotItemMapperEx.findPriceByTypeOutIsPrev(ProjectId, MId, MonthTime); } else { - return depotItemMapper.findPriceByTypeOutIsNotPrev(ProjectId, MId, MonthTime); + return depotItemMapperEx.findPriceByTypeOutIsNotPrev(ProjectId, MId, MonthTime); } } } public BigDecimal buyOrSale(String type, String subType, Long MId, String MonthTime, String sumType) { if (SUM_TYPE.equals(sumType)) { - return depotItemMapper.buyOrSaleNumber(type, subType, MId, MonthTime, sumType); + return depotItemMapperEx.buyOrSaleNumber(type, subType, MId, MonthTime, sumType); } else { - return depotItemMapper.buyOrSalePrice(type, subType, MId, MonthTime, sumType); + return depotItemMapperEx.buyOrSalePrice(type, subType, MId, MonthTime, sumType); } } public BigDecimal findGiftByType(String subType, Integer ProjectId, Long MId, String type) { if (IN.equals(type)) { - return depotItemMapper.findGiftByTypeIn(subType, ProjectId, MId); + return depotItemMapperEx.findGiftByTypeIn(subType, ProjectId, MId); } else { - return depotItemMapper.findGiftByTypeOut(subType, ProjectId, MId); + return depotItemMapperEx.findGiftByTypeOut(subType, ProjectId, MId); } } @Transactional(value = "transactionManager", rollbackFor = Exception.class) - public String saveDetials(String inserted, String deleted, String updated, Long headerId) throws DataAccessException{ - //转为json + public String saveDetials(String inserted, String deleted, String updated, Long headerId) throws Exception{ + //查询单据主表信息 + DepotHead depotHead=depotHeadMapper.selectByPrimaryKey(headerId); + //获得当前操作人 + User userInfo=userService.getCurrentUser(); + //转为json JSONArray insertedJson = JSONArray.parseArray(inserted); JSONArray deletedJson = JSONArray.parseArray(deleted); JSONArray updatedJson = JSONArray.parseArray(updated); + /** + * 2019-01-28优先处理删除的 + * 删除的可以继续卖,删除的需要将使用的序列号回收 + * 插入的需要判断当前货源是否充足 + * 更新的需要判断货源是否充足 + * */ + if (null != deletedJson) { + for (int i = 0; i < deletedJson.size(); i++) { + //首先回收序列号,如果是调拨,不用处理序列号 + JSONObject tempDeletedJson = JSONObject.parseObject(deletedJson.getString(i)); + if(BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType()) + &&!BusinessConstants.SUB_TYPE_TRANSFER.equals(depotHead.getSubtype())){ + DepotItem depotItem = getDepotItem(tempDeletedJson.getLong("Id")); + serialNumberMapperEx.cancelSerialNumber(depotItem.getMaterialid(),depotItem.getHeaderid(),depotItem.getOpernumber().intValue(), + new Date(),userInfo==null?null:userInfo.getId()); + } + this.deleteDepotItem(tempDeletedJson.getLong("Id")); + } + } if (null != insertedJson) { for (int i = 0; i < insertedJson.size(); i++) { DepotItem depotItem = new DepotItem(); @@ -289,18 +329,25 @@ public class DepotItemService { depotItem.setMtype(tempInsertedJson.getString("MType")); } this.insertDepotItemWithObj(depotItem); + /**出库时处理序列号*/ + if(BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType()) + &&!BusinessConstants.SUB_TYPE_TRANSFER.equals(depotHead.getSubtype())){ + //查询单据子表中开启序列号的数据列表 + serialNumberService.checkAndUpdateSerialNumber(depotItem,userInfo); + } } } - if (null != deletedJson) { - for (int i = 0; i < deletedJson.size(); i++) { - JSONObject tempDeletedJson = JSONObject.parseObject(deletedJson.getString(i)); - this.deleteDepotItem(tempDeletedJson.getLong("Id")); - } - } + if (null != updatedJson) { for (int i = 0; i < updatedJson.size(); i++) { JSONObject tempUpdatedJson = JSONObject.parseObject(updatedJson.getString(i)); DepotItem depotItem = this.getDepotItem(tempUpdatedJson.getLong("Id")); + //首先回收序列号 + if(BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType()) + &&!BusinessConstants.SUB_TYPE_TRANSFER.equals(depotHead.getSubtype())) { + serialNumberMapperEx.cancelSerialNumber(depotItem.getMaterialid(), depotItem.getHeaderid(), depotItem.getOpernumber().intValue(), + new Date(),userInfo==null?null:userInfo.getId()); + } depotItem.setId(tempUpdatedJson.getLong("Id")); depotItem.setMaterialid(tempUpdatedJson.getLong("MaterialId")); depotItem.setMunit(tempUpdatedJson.getString("Unit")); @@ -362,6 +409,12 @@ public class DepotItemService { depotItem.setOtherfield5(tempUpdatedJson.getString("OtherField5")); depotItem.setMtype(tempUpdatedJson.getString("MType")); this.updateDepotItemWithObj(depotItem); + /**出库时处理序列号*/ + if(BusinessConstants.DEPOTHEAD_TYPE_OUT.equals(depotHead.getType()) + &&!BusinessConstants.SUB_TYPE_TRANSFER.equals(depotHead.getSubtype())){ + //查询单据子表中开启序列号的数据列表 + serialNumberService.checkAndUpdateSerialNumber(depotItem,userInfo); + } } } return null; @@ -386,4 +439,5 @@ public class DepotItemService { } return unitName; } + } diff --git a/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberService.java b/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberService.java index ec2a2e0b..d87ba48f 100644 --- a/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberService.java +++ b/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberService.java @@ -4,9 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.jsh.erp.constants.BusinessConstants; import com.jsh.erp.constants.ExceptionConstants; import com.jsh.erp.datasource.entities.*; -import com.jsh.erp.datasource.mappers.MaterialMapperEx; -import com.jsh.erp.datasource.mappers.SerialNumberMapper; -import com.jsh.erp.datasource.mappers.SerialNumberMapperEx; +import com.jsh.erp.datasource.mappers.*; import com.jsh.erp.exception.BusinessRunTimeException; import com.jsh.erp.service.depotItem.DepotItemService; import com.jsh.erp.service.material.MaterialService; @@ -39,9 +37,13 @@ public class SerialNumberService { @Resource private MaterialMapperEx materialMapperEx; @Resource + private MaterialMapper materialMapper; + @Resource private DepotItemService depotItemService; @Resource private UserService userService; + @Resource + private DepotItemMapperEx depotItemMapperEx; public SerialNumber getSerialNumber(long id) { @@ -173,9 +175,9 @@ public class SerialNumberService { serialNumberEx.setMaterialId(getSerialNumberMaterialIdByMaterialName(serialNumberEx.getMaterialName())); } //删除标记,默认未删除 - serialNumberEx.setDeleteFlag(false); + serialNumberEx.setDeleteFlag(BusinessConstants.DELETE_FLAG_EXISTS); //已卖出,默认未否 - serialNumberEx.setIsSell(false); + serialNumberEx.setIsSell(BusinessConstants.IS_SELL_HOLD); Date date=new Date(); serialNumberEx.setCreateTime(date); serialNumberEx.setUpdateTime(date); @@ -231,7 +233,7 @@ public class SerialNumberService { } //获得唯一商品 - if(BusinessConstants.MATERIAL_NOT_ENABLE_SERIAL_NUMBER==mlist.get(0).getEnableSerialNumber()){ + if(BusinessConstants.ENABLE_SERIAL_NUMBER_NOT_ENABLED.equals(mlist.get(0).getEnableSerialNumber())){ //商品未开启序列号 throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NOT_ENABLE_SERIAL_NUMBER_CODE, ExceptionConstants.MATERIAL_NOT_ENABLE_SERIAL_NUMBER_MSG); @@ -254,4 +256,66 @@ public class SerialNumberService { return null; } + /** + * create by: cjl + * description: + * 出库时判断序列号库存是否足够, + * 同时将对应的序列号绑定单据 + * create time: 2019/1/24 16:24 + * @Param: List + * @return void + */ + public void checkAndUpdateSerialNumber(DepotItem depotItem,User userInfo) throws Exception{ + if(depotItem!=null){ + //查询商品下已分配的可用序列号数量 + int SerialNumberSum= serialNumberMapperEx.countSerialNumberByMaterialIdAndDepotheadId(depotItem.getMaterialid(),null,BusinessConstants.IS_SELL_HOLD); + if(depotItem.getOpernumber().intValue()>SerialNumberSum){ + //获取商品名称 + Material material= materialMapper.selectByPrimaryKey(depotItem.getMaterialid()); + throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_SERIAL_NUMBERE_NOT_ENOUGH_CODE, + String.format(ExceptionConstants.MATERIAL_SERIAL_NUMBERE_NOT_ENOUGH_MSG,material==null?"":material.getName())); + } + //商品下序列号充足,分配序列号 + sellSerialNumber(depotItem.getMaterialid(),depotItem.getHeaderid(),depotItem.getOpernumber().intValue(),userInfo); + } + + } + /** + * + * + * */ + /** + * create by: cjl + * description: + * 卖出序列号 + * create time: 2019/1/25 9:17 + * @Param: materialId +  * @Param: depotheadId +  * @Param: isSell 卖出'1' +  * @Param: Count 卖出或者赎回的数量 + * @return com.jsh.erp.datasource.entities.SerialNumberEx + */ + @Transactional(value = "transactionManager", rollbackFor = Exception.class) + public int sellSerialNumber(Long materialId, Long depotheadId,int count,User user) throws Exception{ + return serialNumberMapperEx.sellSerialNumber(materialId,depotheadId,count,new Date(),user==null?null:user.getId()); + } + + /** + * create by: cjl + * description: + * 赎回序列号 + * create time: 2019/1/25 9:17 + * @Param: materialId +  * @Param: depotheadId +  * @Param: isSell 赎回'0' +  * @Param: Count 卖出或者赎回的数量 + * @return com.jsh.erp.datasource.entities.SerialNumberEx + */ + @Transactional(value = "transactionManager", rollbackFor = Exception.class) + public int cancelSerialNumber(Long materialId, Long depotheadId,int count,User user) throws Exception{ + return serialNumberMapperEx.cancelSerialNumber(materialId,depotheadId,count,new Date(),user==null?null:user.getId()); + } + + + } diff --git a/src/main/java/com/jsh/erp/service/supplier/SupplierService.java b/src/main/java/com/jsh/erp/service/supplier/SupplierService.java index 1f4ef4c3..72d97945 100644 --- a/src/main/java/com/jsh/erp/service/supplier/SupplierService.java +++ b/src/main/java/com/jsh/erp/service/supplier/SupplierService.java @@ -78,8 +78,13 @@ public class SupplierService { @Transactional(value = "transactionManager", rollbackFor = Exception.class) public int updateAdvanceIn(Long supplierId, BigDecimal advanceIn){ Supplier supplier = supplierMapper.selectByPrimaryKey(supplierId); - supplier.setAdvancein(supplier.getAdvancein().add(advanceIn)); //增加预收款的金额,可能增加的是负值 - return supplierMapper.updateByPrimaryKeySelective(supplier); + if(supplier!=null){ + supplier.setAdvancein(supplier.getAdvancein().add(advanceIn)); //增加预收款的金额,可能增加的是负值 + return supplierMapper.updateByPrimaryKeySelective(supplier); + }else{ + return 0; + } + } public List findBySelectCus() { diff --git a/src/main/resources/mapper_xml/DepotHeadMapperEx.xml b/src/main/resources/mapper_xml/DepotHeadMapperEx.xml index 2209360c..0995fd7f 100644 --- a/src/main/resources/mapper_xml/DepotHeadMapperEx.xml +++ b/src/main/resources/mapper_xml/DepotHeadMapperEx.xml @@ -1,8 +1,8 @@ - + - + @@ -282,4 +282,112 @@ + + insert into jsh_depothead (Type, SubType, + ProjectId, DefaultNumber, Number, + OperPersonName, CreateTime, OperTime, + OrganId, HandsPersonId, AccountId, + ChangeAmount, AllocationProjectId, TotalPrice, + PayType, Remark, Salesman, + AccountIdList, AccountMoneyList, Discount, + DiscountMoney, DiscountLastMoney, OtherMoney, + OtherMoneyList, OtherMoneyItem, AccountDay, + Status) + values (#{type,jdbcType=VARCHAR}, #{subtype,jdbcType=VARCHAR}, + #{projectid,jdbcType=BIGINT}, #{defaultnumber,jdbcType=VARCHAR}, #{number,jdbcType=VARCHAR}, + #{operpersonname,jdbcType=VARCHAR}, #{createtime,jdbcType=TIMESTAMP}, #{opertime,jdbcType=TIMESTAMP}, + #{organid,jdbcType=BIGINT}, #{handspersonid,jdbcType=BIGINT}, #{accountid,jdbcType=BIGINT}, + #{changeamount,jdbcType=DECIMAL}, #{allocationprojectid,jdbcType=BIGINT}, #{totalprice,jdbcType=DECIMAL}, + #{paytype,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, #{salesman,jdbcType=VARCHAR}, + #{accountidlist,jdbcType=VARCHAR}, #{accountmoneylist,jdbcType=VARCHAR}, #{discount,jdbcType=DECIMAL}, + #{discountmoney,jdbcType=DECIMAL}, #{discountlastmoney,jdbcType=DECIMAL}, #{othermoney,jdbcType=DECIMAL}, + #{othermoneylist,jdbcType=VARCHAR}, #{othermoneyitem,jdbcType=VARCHAR}, #{accountday,jdbcType=INTEGER}, + #{status,jdbcType=BIT}) + + + update jsh_depothead + + + Type = #{type,jdbcType=VARCHAR}, + + + SubType = #{subtype,jdbcType=VARCHAR}, + + + ProjectId = #{projectid,jdbcType=BIGINT}, + + + DefaultNumber = #{defaultnumber,jdbcType=VARCHAR}, + + + Number = #{number,jdbcType=VARCHAR}, + + + OperPersonName = #{operpersonname,jdbcType=VARCHAR}, + + + OperTime = #{opertime,jdbcType=TIMESTAMP}, + + + OrganId = #{organid,jdbcType=BIGINT}, + + + HandsPersonId = #{handspersonid,jdbcType=BIGINT}, + + + AccountId = #{accountid,jdbcType=BIGINT}, + + + ChangeAmount = #{changeamount,jdbcType=DECIMAL}, + + + AllocationProjectId = #{allocationprojectid,jdbcType=BIGINT}, + + + TotalPrice = #{totalprice,jdbcType=DECIMAL}, + + + PayType = #{paytype,jdbcType=VARCHAR}, + + + Remark = #{remark,jdbcType=VARCHAR}, + + + Salesman = #{salesman,jdbcType=VARCHAR}, + + + AccountIdList = #{accountidlist,jdbcType=VARCHAR}, + + + AccountMoneyList = #{accountmoneylist,jdbcType=VARCHAR}, + + + Discount = #{discount,jdbcType=DECIMAL}, + + + DiscountMoney = #{discountmoney,jdbcType=DECIMAL}, + + + DiscountLastMoney = #{discountlastmoney,jdbcType=DECIMAL}, + + + OtherMoney = #{othermoney,jdbcType=DECIMAL}, + + + OtherMoneyList = #{othermoneylist,jdbcType=VARCHAR}, + + + OtherMoneyItem = #{othermoneyitem,jdbcType=VARCHAR}, + + + AccountDay = #{accountday,jdbcType=INTEGER}, + + + Status = #{status,jdbcType=BIT}, + + + where Id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/src/main/resources/mapper_xml/DepotItemMapperEx.xml b/src/main/resources/mapper_xml/DepotItemMapperEx.xml index a52c129b..4e4e54be 100644 --- a/src/main/resources/mapper_xml/DepotItemMapperEx.xml +++ b/src/main/resources/mapper_xml/DepotItemMapperEx.xml @@ -1,6 +1,7 @@ - + + @@ -12,12 +13,12 @@ - + - + @@ -33,7 +34,7 @@ - + @@ -41,7 +42,7 @@ - select * FROM jsh_depotitem where 1=1 @@ -274,4 +275,35 @@ and jsh_depotitem.MaterialId =${MId} + + + delete from jsh_depotitem + where 1=1 + and HeaderId in + ( + + #{depotheadId} + + ) + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper_xml/MaterialMapper.xml b/src/main/resources/mapper_xml/MaterialMapper.xml index da08d931..cbf48213 100644 --- a/src/main/resources/mapper_xml/MaterialMapper.xml +++ b/src/main/resources/mapper_xml/MaterialMapper.xml @@ -29,7 +29,7 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - + diff --git a/src/main/resources/mapper_xml/SerialNumberMapper.xml b/src/main/resources/mapper_xml/SerialNumberMapper.xml index ea0d1c84..a4f7d571 100644 --- a/src/main/resources/mapper_xml/SerialNumberMapper.xml +++ b/src/main/resources/mapper_xml/SerialNumberMapper.xml @@ -9,13 +9,14 @@ - + - + + id, material_Id, serial_Number, is_Sell, remark, delete_Flag, create_Time, creator, - update_Time, updater + update_Time, updater,depothead_Id