From 6491ca305c74509f0cc4ba1ed84ba497069e8072 Mon Sep 17 00:00:00 2001 From: erdanergou Date: Fri, 4 Nov 2022 14:01:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=BA=93=E5=AD=98=E7=9B=98?= =?UTF-8?q?=E7=82=B9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QyWx_template_card/MessageByMarkDown.java | 4 + .../controller/CompanyController.java | 15 +- .../DepositoryRecordController.java | 17 +- .../controller/MaterialController.java | 107 ++- .../controller/PageController.java | 191 +++- .../controller/QyWxOperationController.java | 41 +- .../controller/StockTakingController.java | 217 +++++ .../depository_manage/entity/Material.java | 2 +- .../entity/StockTakingChild.java | 38 + .../mapper/DepositoryMapper.java | 2 +- .../mapper/DepositoryMapper.xml | 2 +- .../mapper/MaterialMapper.java | 8 + .../mapper/MaterialMapper.xml | 10 +- .../mapper/StockTakingMapper.java | 176 ++++ .../pojo/SimpleStockTakingP.java | 42 + .../service/CompanyService.java | 8 + .../service/StockTakingService.java | 108 +++ .../service/impl/CompanyServiceImpl.java | 208 ++++- .../impl/DepositoryRecordServiceImpl.java | 31 +- .../service/impl/DepositoryServiceImpl.java | 10 +- .../service/impl/ExcelServiceImpl.java | 2 +- .../service/impl/MaterialServiceImpl.java | 47 +- .../service/impl/QyWxOperationService.java | 508 ++++++++-- .../service/impl/StockTakingServiceImpl.java | 867 ++++++++++++++++++ .../pages/application/application-in.html | 3 +- .../templates/pages/application/my-apply.html | 44 + .../templates/pages/application/my-task.html | 110 ++- .../pages/material/material-view.html | 2 +- .../selectMaterialByCardForTaking.html | 1 - .../pages/stockTaking/stockTakingReview.html | 350 +++++++ .../pages/stockTaking/stockTakingView.html | 291 ++++++ .../pages/stockTaking/stockTransfer.html | 395 ++++++++ .../dreamchaser/depository_manage/Test.java | 11 +- .../mapper/DepositoryMapper.xml | 2 +- .../mapper/MaterialMapper.xml | 10 +- .../pages/application/application-in.html | 3 +- .../templates/pages/application/my-apply.html | 44 + .../templates/pages/application/my-task.html | 110 ++- .../pages/material/material-view.html | 2 +- 39 files changed, 3856 insertions(+), 183 deletions(-) create mode 100644 src/main/java/com/dreamchaser/depository_manage/controller/StockTakingController.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/entity/StockTakingChild.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/mapper/StockTakingMapper.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/pojo/SimpleStockTakingP.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/service/StockTakingService.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/service/impl/StockTakingServiceImpl.java create mode 100644 src/main/resources/templates/pages/stockTaking/stockTakingReview.html create mode 100644 src/main/resources/templates/pages/stockTaking/stockTakingView.html create mode 100644 src/main/resources/templates/pages/stockTaking/stockTransfer.html diff --git a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/MessageByMarkDown.java b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/MessageByMarkDown.java index d7327538..2d96a67e 100644 --- a/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/MessageByMarkDown.java +++ b/src/main/java/com/dreamchaser/depository_manage/config/QyWx_template_card/MessageByMarkDown.java @@ -2,6 +2,10 @@ package com.dreamchaser.depository_manage.config.QyWx_template_card; import lombok.Data; + +/** + * 用于发送markdown消息 + */ @Data public class MessageByMarkDown extends BaseMessage { private Object markdown; diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/CompanyController.java b/src/main/java/com/dreamchaser/depository_manage/controller/CompanyController.java index 46dd18e4..a8870096 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/CompanyController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/CompanyController.java @@ -78,7 +78,7 @@ public class CompanyController { AdministrationP administrationP = new AdministrationP(administration); administrationPList.add(administrationP); } - return new RestResponse(list,total,200); + return new RestResponse(administrationPList,total,200); } /** @@ -317,4 +317,17 @@ public class CompanyController { return new RestResponse(postPS, postPS.size(), 200); } + + /** + * 用于进行选择负责人 + * @param request + * @return + */ + @GetMapping("/treeMenus") + public RestResponse InitTreeMenus(HttpServletRequest request) { + List list = new ArrayList<>(); + UserByPort userToken = (UserByPort) request.getAttribute("userToken"); + list = companyService.InitTreeMenus(userToken); + return new RestResponse(list); + } } diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java index 0fdf72d4..f664cca5 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java @@ -6,19 +6,16 @@ import com.dreamchaser.depository_manage.config.PortConfig; import com.dreamchaser.depository_manage.entity.*; import com.dreamchaser.depository_manage.exception.MyException; import com.dreamchaser.depository_manage.pojo.*; -import com.dreamchaser.depository_manage.security.bean.UserToken; import com.dreamchaser.depository_manage.service.*; import com.dreamchaser.depository_manage.service.impl.QyWxOperationService; import com.dreamchaser.depository_manage.utils.CrudUtil; import com.dreamchaser.depository_manage.utils.DateUtil; import com.dreamchaser.depository_manage.utils.HttpUtils; import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; -import netscape.javascript.JSObject; import org.apache.http.protocol.HTTP; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @@ -315,7 +312,7 @@ public class DepositoryRecordController { integer += depositoryRecordService.insertApplicationOutMin(map); } // 向企业微信中对应用户发送消息 - JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); + JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); // 将当前返回结果保存到redis中 Map QyWxMessageMap = new HashMap<>(); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); @@ -364,7 +361,7 @@ public class DepositoryRecordController { map.remove("id"); // 插入子订单 integer += depositoryRecordService.insertApplicationOutMin(map); - JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); + JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); // 将当前返回结果保存到redis中 Map QyWxMessageMap = new HashMap<>(); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); @@ -623,7 +620,7 @@ public class DepositoryRecordController { if(params.size() < 1 && map.size() > 4){ integer += depositoryRecordService.transferApply(map,userToken); Object id = map.get("parentId"); - JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); + JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); // 将当前返回结果保存到redis中 Map QyWxMessageMap = new HashMap<>(); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); @@ -645,7 +642,7 @@ public class DepositoryRecordController { insert.put("code",map.get("code"+temp)); integer += depositoryRecordService.transferApply(insert,userToken); Object id = insert.get("parentId"); - JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); + JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); // 将当前返回结果保存到redis中 Map QyWxMessageMap = new HashMap<>(); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); @@ -657,7 +654,7 @@ public class DepositoryRecordController { } integer += depositoryRecordService.transferApply(map,userToken); Object id = map.get("parentId"); - JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); + JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); // 将当前返回结果保存到redis中 Map QyWxMessageMap = new HashMap<>(); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); @@ -801,7 +798,7 @@ public class DepositoryRecordController { } success += depositoryRecordService.insertApplicationOutMin(map); // 向企业微信中对应用户发送消息 - JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); + JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); // 将当前返回结果保存到redis中 Map QyWxMessageMap = new HashMap<>(); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); @@ -967,7 +964,7 @@ public class DepositoryRecordController { } } // 向企业微信中对应用户发送消息 - JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); + JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(departMentHeadQyWxName.toString(), ObjectFormatUtil.toInteger(id), true); // 将当前返回结果保存到redis中 Map QyWxMessageMap = new HashMap<>(); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java b/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java index 254d063c..b30564e7 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java @@ -244,6 +244,43 @@ public class MaterialController { return new RestResponse(map, 1, 200); } + /** + * 根据物料id与库位id获取物料 + * + * @param mid + * @return + */ + @GetMapping("/findMatrialByIdAndPid") + public RestResponse findMatrialByIdAndPid(@RequestParam(value = "mid", required = false) String mid, + @RequestParam(value = "pid", required = false) String pid, + HttpServletRequest request) { + UserByPort userToken = (UserByPort) request.getAttribute("userToken"); + if ("".equals(mid)) { + return new RestResponse("", 0, 200); + } + Map map = new HashMap<>(); + Material materialById = materialService.findMaterialById(ObjectFormatUtil.toInteger(mid)); + List placePList = new ArrayList<>(); + List depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userToken.getMaindeparment().toString()); + for (int i = 0; i < depositoryByAdminorg.size(); i++) { + List placeByMidAndDid = placeService.findPlaceByMidAndDid(ObjectFormatUtil.toInteger(mid), depositoryByAdminorg.get(i).getId()); + placePList.addAll(placeByMidAndDid); + } + Map param = new HashMap<>(); + param.put("code", materialById.getCode()); + Map paramByBarcode = new HashMap<>(); + paramByBarcode.put("mcode", materialById.getCode()); + List materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(paramByBarcode); + materialById.setMaterialAndBarCodeList(materialByBarCodeByCondition); + MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(ObjectFormatUtil.toInteger(pid), materialById.getId()); + materialById.setQuantity(placeAndMaterialByMidAndPid.getQuantity()); + map.put("materialById", materialById); + + map.put("placeList", placePList); + return new RestResponse(map, 1, 200); + } + + /** * 根据物料编码获取物料 * @@ -521,6 +558,14 @@ public class MaterialController { // 如果当前物料不在该库位 flag = false; } + mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity()); + } else { + MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(0, materialP.getId()); + if (placeAndMaterialByMidAndPid == null) { + // 如果当前物料不在该库位 + flag = false; + } + mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity()); } mp = materialP; } else { @@ -716,17 +761,27 @@ public class MaterialController { if (inventory.size() > 0) { // 如果存在该物料 MaterialP materialP = inventory.get(0); - Map paramByBarCode = new HashMap<>(); - paramByBarCode.put("mcode",materialP.getCode()); + Map paramByBarCode = new HashMap<>(); + paramByBarCode.put("mcode", materialP.getCode()); List materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(paramByBarCode); materialP.setMaterialAndBarCodeList(materialByBarCodeByCondition); isExist = true; - if(!"0".equals(placeId)) { + if (!"0".equals(placeId)) { // 如果不是默认库位 // 获取物料与库位的对应关系 - MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(materialP.getId(), ObjectFormatUtil.toInteger(placeId)); - if(placeAndMaterialByMidAndPid == null){ + MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(ObjectFormatUtil.toInteger(placeId), materialP.getId()); + if (placeAndMaterialByMidAndPid == null) { isExist = false; + }else{ + mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity()); + } + } else { + // 获取物料与库位的对应关系 + MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(0, materialP.getId()); + if (placeAndMaterialByMidAndPid == null) { + isExist = false; + }else{ mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity()); + } } mp = materialP; @@ -763,6 +818,14 @@ public class MaterialController { // 如果当前物料不在该库位 tempflag = false; } + mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity()); + } else { + // 获取物料与库位的对应关系 + MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(0, materialP.getId()); + if (placeAndMaterialByMidAndPid == null) { + tempflag = false; + } + mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity()); } mp = materialP; } else { @@ -890,34 +953,46 @@ public class MaterialController { if ("".equals(code)) { return new RestResponse(null, 1, 200); } - param.put("code", code); + param.put("mcode", code); List materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(param); List materialPByCondition = new ArrayList<>(); MaterialP mp = null; - if ("0".equals(placeId)) { - // 如果是默认库位 - param.put("depositoryId", depositoryId); - materialPByCondition = materialService.findInventory(param); - } else { // 如果不是默认库位 - // 获取当前库位 - Place placeById = placeService.findPlaceById(ObjectFormatUtil.toInteger(placeId)); - param.put("depositoryId", depositoryId); - materialPByCondition = materialService.findInventory(param); - } + + param.put("code", code); + param.put("depositoryId", depositoryId); + materialPByCondition = materialService.findInventory(param); + if (materialPByCondition.size() > 0) { // 如果成功获取 mp = materialPByCondition.get(0); mp.setMaterialAndBarCodeList(materialByBarCodeByCondition); if (!"0".equals(placeId)) { // 如果不是获取默认库位 + MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(ObjectFormatUtil.toInteger(placeId), mp.getId()); + + if (placeAndMaterialByMidAndPid == null) { + // 如果当前库位没有该物料 + mp = null; + }else{ + mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity()); + } + + } else { + MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(0, mp.getId()); + if (placeAndMaterialByMidAndPid == null) { // 如果当前库位没有该物料 mp = null; + }else{ + mp.setQuantity(placeAndMaterialByMidAndPid.getQuantity()); } + } } return new RestResponse(mp, 1, 200); } + + } diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java b/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java index 2efb7211..9edba8bc 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java @@ -78,6 +78,9 @@ public class PageController { @Autowired private RedisTemplate redisTemplateForHash; + @Autowired + private StockTakingService stockTakingService; + @@ -411,6 +414,14 @@ public class PageController { return mv; } + // 负责人树形菜单页面 + @GetMapping("/selectManager") + public ModelAndView selectManager(){ + ModelAndView mv = new ModelAndView(); + mv.setViewName("pages/post/selectManager"); + return mv; + } + // 专用于卡片物料树形菜单页面 @GetMapping("/selectMaterialByCard") public ModelAndView selectMaterialByCard(String mname,String type,String clickObj){ @@ -1297,6 +1308,117 @@ public class PageController { return mv; } + + + + @GetMapping("/StockTakingReview") + public ModelAndView StockTakingReview(Integer id,HttpServletRequest request){ + ModelAndView mv = new ModelAndView(); + UserByPort userToken = (UserByPort) request.getAttribute("userToken"); + mv.setViewName("pages/stockTaking/stockTakingReview"); + // 获取盘点记录主表 + StockTaking stockTaking = stockTakingService.findStockTakingById(id); + // 获取主表下的所有子表 + List stockTakingChildPByMainId = stockTakingService.findStockTakingChildPByMainId(id); + + StockTakingP stp = new StockTakingP(stockTaking); + // 设置发起时间 + stp.setCreateTime(DateUtil.TimeStampToDateTime(stockTaking.getCreateTime())); + + // 获取申请人 + UserByPort userByPort = FindUserById(stockTaking.getOriginator(),userToken); + // 设置盘点发起人姓名 + stp.setOriginatorName(userByPort.getName()); + + // 负责人姓名 + StringBuilder managerName = new StringBuilder(); + String[] split = stp.getDepartmentManager().split(","); + for (int i = 0; i < split.length; i++) { + String s = split[i]; + if("".equals(s)){ + continue; + } + UserByPort manager = FindUserById(ObjectFormatUtil.toInteger(s), userToken); + managerName.append(manager.getName()+","); + } + stp.setDepartmentManagerName(managerName.toString()); + + // 获取盘点位置 + Integer placeId = stockTaking.getPlaceId(); + StringBuilder location = new StringBuilder(); + Depository depository = depositoryService.findDepositoryRecordById(stockTaking.getDepositoryId()); + location.append(depository.getDname()); + if(!(Integer.compare(placeId,0) == 0)){ + // 如果不是默认库位 + Place placeById = placeService.findPlaceById(placeId); + location.append("-"+placeById.getCode()); + } + // 设置盘点位置 + stp.setDepositoryName(location.toString()); + mv.addObject("mainRecord",stp); + mv.addObject("recordChild",stockTakingChildPByMainId); + return mv; + } + + // 跳转到盘点详情 + @GetMapping("/StockTakingView") + public ModelAndView StockTakingView(Integer id,HttpServletRequest request){ + ModelAndView mv = new ModelAndView(); + UserByPort userToken = (UserByPort) request.getAttribute("userToken"); + mv.setViewName("pages/stockTaking/stockTakingView"); + // 获取盘点记录主表 + StockTaking stockTaking = stockTakingService.findStockTakingById(id); + // 获取主表下的所有子表 + List stockTakingChildPByMainId = stockTakingService.findStockTakingChildPByMainId(id); + + StockTakingP stp = new StockTakingP(stockTaking); + // 设置发起时间 + stp.setCreateTime(DateUtil.TimeStampToDateTime(stockTaking.getCreateTime())); + + + stp.setCompleteTime(""); + // 获取完成时间 + Long completeTime = stockTaking.getCompleteTime(); + if(completeTime != null){ + // 如果已经完成审核 + stp.setCompleteTime(DateUtil.TimeStampToDateTime(completeTime)); + } + + // 获取申请人 + UserByPort userByPort = FindUserById(stockTaking.getOriginator(),userToken); + // 设置盘点发起人姓名 + stp.setOriginatorName(userByPort.getName()); + + // 负责人姓名 + StringBuilder managerName = new StringBuilder(); + String[] split = stp.getDepartmentManager().split(","); + for (int i = 0; i < split.length; i++) { + String s = split[i]; + if("".equals(s)){ + continue; + } + UserByPort manager = FindUserById(ObjectFormatUtil.toInteger(s), userToken); + managerName.append(manager.getName()+","); + } + stp.setDepartmentManagerName(managerName.toString()); + + // 获取盘点位置 + Integer placeId = stockTaking.getPlaceId(); + StringBuilder location = new StringBuilder(); + Depository depository = depositoryService.findDepositoryRecordById(stockTaking.getDepositoryId()); + location.append(depository.getDname()); + if(!(Integer.compare(placeId,0) == 0)){ + // 如果不是默认库位 + Place placeById = placeService.findPlaceById(placeId); + location.append("-"+placeById.getCode()); + } + // 设置盘点位置 + stp.setDepositoryName(location.toString()); + mv.addObject("mainRecord",stp); + mv.addObject("recordChild",stockTakingChildPByMainId); + return mv; + } + @GetMapping("/account_look") public ModelAndView account_look(Integer id, HttpServletRequest request) { ModelAndView mv = new ModelAndView(); @@ -1385,7 +1507,8 @@ public class PageController { @GetMapping("/company_detail") - public ModelAndView company_detail(Integer id,UserByPort userByPort) { + public ModelAndView company_detail(Integer id,HttpServletRequest request) { + UserByPort userByPort = (UserByPort) request.getAttribute("userToken"); String url = PortConfig.external_url + "/org/getgovcont"; Map map = new HashMap<>(); ModelAndView mv = new ModelAndView(); @@ -1798,11 +1921,75 @@ public class PageController { // 跳转至库存盘点页面 @GetMapping("/stockTaking") public ModelAndView stockTaking(HttpServletRequest request){ + UserByPort userToken = (UserByPort) request.getAttribute("userToken"); + ModelAndView mv = new ModelAndView(); + // 获取仓储中心详情 + Administration company = PageController.getCompany(361, userToken); + // 获取仓储中心负责人 + List departmentHeadByUser = PortConfig.findDepartmentHeadByUser(company, userToken); + StringBuilder departmentHeadName = new StringBuilder(); + StringBuilder departmentHeadId = new StringBuilder(); + for (int i = 0; i < departmentHeadByUser.size(); i++) { + UserByPort userByPort = departmentHeadByUser.get(i); + departmentHeadName.append(userByPort.getName()).append(","); + departmentHeadId.append(userByPort.getId()).append(","); + } + mv.addObject("departmentHeadName",departmentHeadName.toString()); + mv.addObject("departmentHeadId",departmentHeadId.toString()); + mv.setViewName("pages/stockTaking/stockTaking"); + return mv; + } + + // 用于打开盘点后物料转移页面 + @GetMapping("/stockTakingTransfer") + public ModelAndView stockTakingTransfer(String minIds,HttpServletRequest request){ + UserByPort userToken = (UserByPort) request.getAttribute("userToken"); ModelAndView mv = new ModelAndView(); - mv.setViewName("pages/material/stockTaking"); + List takingChildPS = new ArrayList<>(); + StockTaking stockTaking = null; + String[] split = minIds.split(","); + for (int i = 0; i < split.length; i++) { + String minRecordId = split[i]; + if("".equals(minRecordId)){ + continue; + } + // 获取当前子订单 + StockTakingChildP stcp = stockTakingService.findStockTakingChildPById(ObjectFormatUtil.toInteger(minRecordId)); + + + + // 获取主订单 + stockTaking = stockTakingService.findStockTakingById(stcp.getMainId()); + + Integer placeId = stockTaking.getPlaceId(); + // 获取库位详情 + Place placeById = placeService.findPlaceById(placeId); + + + // 获取当前物料在其库位中的数量 + MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(placeId, stcp.getMid()); + + // 获取盘点数量 + Integer newInventory = stcp.getNewInventory(); + + // 获取当前盘点后超出的数量 + Integer inventory = newInventory + placeById.getQuantity() - placeById.getMax(); + + // 将计算后的数量赋值(最少转移量) + stcp.setInventory(inventory); + + takingChildPS.add(stcp); + + } + mv.addObject("mainRecord",stockTaking); + mv.addObject("recordChild",takingChildPS); + mv.addObject("minIds",minIds); + mv.setViewName("pages/stockTaking/stockTransfer"); return mv; } + + @GetMapping("/scanCodeByTaking") public ModelAndView scanCodeByTaking(){ ModelAndView mv = new ModelAndView(); diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java b/src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java index ccf13f57..902cfe9c 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/QyWxOperationController.java @@ -7,6 +7,7 @@ import com.dreamchaser.depository_manage.config.QyWxConfig; import com.dreamchaser.depository_manage.config.QyWxJMJM.com.qq.weixin.mp.aes.AesException; import com.dreamchaser.depository_manage.config.QyWxJMJM.com.qq.weixin.mp.aes.WXBizMsgCrypt; import com.dreamchaser.depository_manage.entity.CallBackLog; +import com.dreamchaser.depository_manage.entity.StockTaking; import com.dreamchaser.depository_manage.entity.UserByPort; import com.dreamchaser.depository_manage.pojo.callBackXml.CallBackBaseXml; import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard; @@ -15,6 +16,7 @@ import com.dreamchaser.depository_manage.security.pool.UserKeyAndTokenPool; import com.dreamchaser.depository_manage.service.CallBackLogService; import com.dreamchaser.depository_manage.service.DepositoryRecordService; import com.dreamchaser.depository_manage.service.DepositoryService; +import com.dreamchaser.depository_manage.service.StockTakingService; import com.dreamchaser.depository_manage.service.impl.QyWxOperationService; import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; import com.dreamchaser.depository_manage.utils.QyWxXMLUtils; @@ -57,6 +59,10 @@ public class QyWxOperationController { DepositoryRecordService depositoryRecordService; + @Autowired + StockTakingService stockTakingService; + + /** * 用于接收企业微信的回调,get方式 */ @@ -157,20 +163,40 @@ public class QyWxOperationController { // 获取点击的按钮 String clickKey = templateCard.getEventKey().split("_")[1]; + + // 获取点击卡片的类型 + String templateCardType = templateCard.getEventKey().split("_")[2]; + + + String result = ""; if("pass".equals(clickKey)){ result = "通过"; }else{ result = "驳回"; } - // 开启线程处理审批 - new Thread(new Runnable() { - @Override - public void run() { - depositoryRecordService.reviewByQyWx(templateCard); - } - }).start(); + if(templateCardType.contains("StockTaking")){ + // 如果点击的是库存盘点审核 + + // 开启线程处理审批 + new Thread(new Runnable() { + @Override + public void run() { + stockTakingService.reviewByQyWx(templateCard); + } + }).start(); + + }else if(templateCardType.contains("out")){ + // 如果点击的是出库审核 + // 开启线程处理审批 + new Thread(new Runnable() { + @Override + public void run() { + depositoryRecordService.reviewByQyWx(templateCard); + } + }).start(); + } // 开启线程更改其他用户卡片模板样式 String finalResult = result; new Thread(new Runnable() { @@ -180,7 +206,6 @@ public class QyWxOperationController { } }).start(); - // 待加密模板 String sRespData = String.format("" + "" + diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/StockTakingController.java b/src/main/java/com/dreamchaser/depository_manage/controller/StockTakingController.java new file mode 100644 index 00000000..c37e2fe4 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/controller/StockTakingController.java @@ -0,0 +1,217 @@ +package com.dreamchaser.depository_manage.controller; + + +import com.alibaba.fastjson.JSONObject; +import com.dreamchaser.depository_manage.entity.Place; +import com.dreamchaser.depository_manage.entity.UserByPort; +import com.dreamchaser.depository_manage.pojo.RestResponse; +import com.dreamchaser.depository_manage.pojo.SimpleStockTakingP; +import com.dreamchaser.depository_manage.pojo.StatusInfo; +import com.dreamchaser.depository_manage.service.MaterialService; +import com.dreamchaser.depository_manage.service.MaterialTypeService; +import com.dreamchaser.depository_manage.service.PlaceService; +import com.dreamchaser.depository_manage.service.StockTakingService; +import com.dreamchaser.depository_manage.service.impl.QyWxOperationService; +import com.dreamchaser.depository_manage.utils.CrudUtil; +import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * 库存盘点控制器 + */ +@RestController +@RequestMapping("/stockTaking") +public class StockTakingController { + @Autowired + MaterialService materialService; + + @Autowired + MaterialTypeService materialTypeService; + + @Autowired + StockTakingService stockTakingService; + + @Autowired + PlaceService placeService; + + @Autowired + QyWxOperationService qyWxOperationService; + + @Autowired + private RedisTemplate redisTemplateForHash; + + // 用于添加盘点记录 + @PostMapping("/addStockTakingRecord") + public RestResponse addStockTakingRecord(@RequestBody Map map, HttpServletRequest request){ + + UserByPort userToken = (UserByPort) request.getAttribute("userToken"); + List params = (ArrayList) map.get("params"); + String departmentManagerId = (String) map.get("departmentManagerId"); +// map.put("departmentManager",departmentManagerId); + map.put("departmentManager","6235"); + // 用于设置企业微信接收人 + StringBuilder QyWxDepartmentManager = new StringBuilder(); + /*String[] split = departmentManagerId.split(","); + for (int i = 0; i < split.length; i++) { + String s = split[i]; + if("".equals(s)){ + continue; + } + UserByPort departmentManager = PageController.FindUserById(ObjectFormatUtil.toInteger(s), userToken); + QyWxDepartmentManager.append(departmentManager.getWorkwechat()+","); + }*/ + QyWxDepartmentManager.append("PangFuZhen").append(","); + map.put("state",3); + map.remove("departmentManagerId"); + map.put("originator",userToken.getId()); + String mcode = (String) map.get("code"); + map.remove("code"); + Integer success = 0; + if(params.size() > 0){ + // 如果有多个表 + Map param = new HashMap<>(); + param.put("depositoryId",map.get("depositoryId")); + param.put("placeId",map.get("placeId")); + param.put("departmentManager",map.get("departmentManager")); + param.put("state",3); + param.put("originator",userToken.getId()); + for (int i = 0; i < params.size(); i++) { + Integer temp = ObjectFormatUtil.toInteger(params.get(i)); + map.remove("code"); + param.put("mid",map.get("mid"+temp)); + param.put("barCode",map.get("barCode"+temp)); + param.put("oldInventory",map.get("oldInventory"+temp)); + param.put("newInventory",map.get("newInventory"+temp)); + param.put("takingResult",map.get("takingResult"+temp)); + param.put("inventory",map.get("inventory"+temp)); + success += stockTakingService.insertStockTaking(param); + param.remove("id"); + } + param.put("mid",map.get("mid")); + param.put("barCode",map.get("barCode")); + param.put("oldInventory",map.get("oldInventory")); + param.put("newInventory",map.get("newInventory")); + param.put("takingResult",map.get("takingResult")); + param.put("inventory",map.get("inventory")); + success += stockTakingService.insertStockTaking(param); + + Object mainId = param.get("mainId"); + // 向企业微信发送消息 + JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage(QyWxDepartmentManager.toString(), ObjectFormatUtil.toInteger(mainId)); + // 将当前返回结果保存到redis中 + Map QyWxMessageMap = new HashMap<>(); + QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); + QyWxMessageMap.put("responseCode",jsonObject.getString("response_code")); + // key user:300450:QyWxOut:1 + // 申请人number + redisTemplateForHash.opsForHash().putAll("user:"+userToken.getNumber()+":QyWxStockTakingId:"+mainId,QyWxMessageMap); + // 设置过期时间为三天 + redisTemplateForHash.expire("user:"+userToken.getNumber()+":QyWxStockTakingId:"+mainId,72, TimeUnit.HOURS); + } + else{ + // 如果只有一个表 + success += stockTakingService.insertStockTaking(map); + // 向企业微信发送消息 + Object mainId = map.get("mainId"); + JSONObject jsonObject = qyWxOperationService.sendQyWxToStockTakingMessage(QyWxDepartmentManager.toString(), ObjectFormatUtil.toInteger(mainId)); + // 将当前返回结果保存到redis中 + Map QyWxMessageMap = new HashMap<>(); + QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); + QyWxMessageMap.put("responseCode",jsonObject.getString("response_code")); + // key user:300450:QyWxOut:1 + // 申请人number + redisTemplateForHash.opsForHash().putAll("user:"+userToken.getNumber()+":QyWxStockTakingId:"+mainId,QyWxMessageMap); + // 设置过期时间为三天 + redisTemplateForHash.expire("user:"+userToken.getNumber()+":QyWxStockTakingId:"+mainId,72, TimeUnit.HOURS); + } + + if(params.size() > 0 ){ + return CrudUtil.postHandle(success,params.size() + 1); + } + else{ + return CrudUtil.postHandle(success,1); + } + } + + + // 用于查询需要用户审核的盘点 + @GetMapping("/myTask") + public RestResponse myTask(@RequestParam Map map,HttpServletRequest request) { + UserByPort userToken= (UserByPort) request.getAttribute("userToken"); + map.put("userId",userToken.getId()); + List myTask = stockTakingService.findMyTask(map, request); + return new RestResponse(myTask,stockTakingService.findMyTaskCount(map),200); + } + + // 用于审核 + @PostMapping("/review") + public RestResponse review(@RequestBody Map map,HttpServletRequest request){ + UserByPort userToken= (UserByPort) request.getAttribute("userToken"); + Map review = stockTakingService.review(map, userToken); + + if(review.containsKey("errMsg")){ + // 如果有出错情况 + return new RestResponse(review,666,new StatusInfo("有错误","发现错误")); + }else { + return CrudUtil.postHandle(1, 1); + } + + } + + // 用于查询用户提交的盘点 + @GetMapping("/myApply") + public RestResponse myApply(@RequestParam Map map,HttpServletRequest request) { + UserByPort userToken= (UserByPort) request.getAttribute("userToken"); + map.put("userId",userToken.getId()); + List myTask = stockTakingService.findMyApply(map, request); + return new RestResponse(myTask,stockTakingService.findMyApplyCount(map),200); + } + + + // 用于查询转入位置的容量 + @PostMapping("/findInventoryByLocation") + public RestResponse findInventoryByLocation(@RequestBody Map map,HttpServletRequest request) { + UserByPort userToken= (UserByPort) request.getAttribute("userToken"); + String depositoryId = (String) map.get("depositoryId"); + String placeId = (String) map.get("placeId"); + // 获取当前库位 + Place placeById = placeService.findPlaceById(ObjectFormatUtil.toInteger(placeId)); + // 获取当前库位的容量 + Integer inventory = placeById.getMax() - placeById.getQuantity(); + return new RestResponse(inventory); + } + + + // 用于进行盘点库存转移 + @PostMapping("/stockTransfer") + public RestResponse stockTransfer(@RequestBody Map map,HttpServletRequest request) { + + UserByPort userToken = (UserByPort) request.getAttribute("userToken"); + + String minIds = (String) map.get("minIds"); + String[] split = minIds.split(","); + List minIdList = new ArrayList<>(); + for (int i = 0; i < split.length; i++) { + String s = split[i]; + if("".equals(s)){ + continue; + } + minIdList.add(ObjectFormatUtil.toInteger(s)); + + } + map.put("minIds",minIdList); + map.put("inventory",map.get("invnetory5")); + map.remove("invnetory5"); + Integer transfer = stockTakingService.stockTakingTransfer(map, userToken); + return CrudUtil.postHandle(transfer,minIdList.size()); + } +} diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/Material.java b/src/main/java/com/dreamchaser/depository_manage/entity/Material.java index 83418d02..93e4310e 100644 --- a/src/main/java/com/dreamchaser/depository_manage/entity/Material.java +++ b/src/main/java/com/dreamchaser/depository_manage/entity/Material.java @@ -31,7 +31,7 @@ public class Material { private Double amounts; /** 物料种类id */ - private Long typeId; + private Long materialTypeId; /** 物料状态 */ private Integer state; diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/StockTakingChild.java b/src/main/java/com/dreamchaser/depository_manage/entity/StockTakingChild.java new file mode 100644 index 00000000..347a9f11 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/entity/StockTakingChild.java @@ -0,0 +1,38 @@ +package com.dreamchaser.depository_manage.entity; + +import lombok.Data; + +/** + * 盘点子类 + */ +@Data +public class StockTakingChild { + /** + * id + */ + private Integer id; + /** + * 物料id + */ + private Integer mid; + /** + * 库存容量 + */ + private Integer oldInventory; + /** + * 盘点数量 + */ + private Integer newInventory; + /** + * 盘点结果 + */ + private String takingResult; + /** + * 盈亏数量 + */ + private Integer inventory; + /** + * 主表id + */ + private Long mainId; +} diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.java b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.java index 9f3ce302..07c01771 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.java +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.java @@ -70,7 +70,7 @@ public interface DepositoryMapper { * @param id 参数id * @return 对应仓库信息 */ - Depository findDepositoryRecordById(Integer id); + Depository findDepositoryById(Integer id); /** * 根据条件修改数据信息 diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml index 7fb56933..52718889 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml @@ -170,7 +170,7 @@ - SELECT FROM depository d WHERE d.id = #{id} diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java index d26c6de9..9f644355 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java @@ -24,6 +24,14 @@ public interface MaterialMapper { * @return 受影响的行数 */ Integer insertMaterial(Map map); + + /** + * 增加一条库存记录 + * + * @param material + * @return 受影响的行数 + */ + Integer insertMaterial(Material material); /** * 增加库存记录 * diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml index 48a8b558..03fcd375 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml @@ -11,7 +11,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -345,7 +345,7 @@ - + INSERT INTO material ( id, depository_id, mname, quantity, price, type_id,code,unit,version,texture,amounts,depositoryCode ) VALUES ( @@ -467,8 +467,8 @@ price = #{price}, - - type_id = #{typeId}, + + type_id = #{materialTypeId}, state = #{state}, diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/StockTakingMapper.java b/src/main/java/com/dreamchaser/depository_manage/mapper/StockTakingMapper.java new file mode 100644 index 00000000..ab666c1b --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/StockTakingMapper.java @@ -0,0 +1,176 @@ +package com.dreamchaser.depository_manage.mapper; + + +import com.dreamchaser.depository_manage.entity.StockTaking; +import com.dreamchaser.depository_manage.entity.StockTakingChild; +import com.dreamchaser.depository_manage.pojo.StockTakingChildP; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; + +@Repository +@Mapper +public interface StockTakingMapper { + + /** + * 用于插入盘点记录主表 + * @param map + * @return + */ + Integer insertStockTaking(Map map); + + /** + * 用于插入盘点记录主表 + * @param st + * @return + */ + Integer insertStockTaking(StockTaking st); + + /** + * 用于插入盘点记录子表 + * @param map + * @return + */ + Integer insertStockTakingChild(Map map); + + /** + * 用于插入盘点记录子表 + * @param stc + * @return + */ + Integer insertStockTakingChild(StockTakingChild stc); + + + /** + * 根据主键id删除子表 + * @param id + * @return + */ + Integer deleteStockTakingChild(Integer id); + + /** + * 根据主键id批量删除子表 + * @param list + * @return + */ + Integer deleteStockTakingChilds(List list); + + /** + * 根据主键删除主表 + * @param id + * @return + */ + Integer deleteStockTaking(Integer id); + + /** + * 根据主键批量删除主表 + * @param list + * @return + */ + Integer deleteStockTakings(List list); + + /** + * 修改主表记录 + * @param map + * @return + */ + Integer updateStockTaking(Map map); + + /** + * 修改主表记录 + * @param st + * @return + */ + Integer updateStockTaking(StockTaking st); + + + /** + * 修改子表记录 + * @param map + * @return + */ + Integer updateStockTakingChild(Map map); + + + /** + * 修改子表记录 + * @param stc + * @return + */ + Integer updateStockTakingChild(StockTakingChild stc); + + + /** + * 根据主表id查询所有子表 + * @param mainId + * @return + */ + List selectStockTakingChildByMainId(Integer mainId); + + + /** + * 根据条件查询主表 + * @param map + * @return + */ + List selectStockTakingByCondition(Map map); + + + /** + * 根据条件查询盘点详情 + * @param map + * @return + */ + List selectStockTakingChildPByCondition(Map map); + + /** + * 根据主键查找主表 + * @param id + * @return + */ + StockTaking selectStockTakingById(Integer id); + + /** + * 根据主键查找主表 + * @param id + * @return + */ + StockTaking selectStockTakingById(Long id); + /** + * 根据主键查找盘点详情 + * @param id + * @return + */ + StockTakingChildP selectStockTakingChildPById(Integer id); + + + /** + * 查询用户的任务 + * @param map + * @return + */ + List findMyTask(Map map); + + /** + * 查询用户的任务数量 + * @param map + * @return + */ + Integer findMyTaskCount(Map map); + + /** + * 查询用户的申请 + * @param map + * @return + */ + List findMyApply(Map map); + + /** + * 查询用户的申请数量 + * @param map + * @return + */ + Integer findMyApplyCount(Map map); +} diff --git a/src/main/java/com/dreamchaser/depository_manage/pojo/SimpleStockTakingP.java b/src/main/java/com/dreamchaser/depository_manage/pojo/SimpleStockTakingP.java new file mode 100644 index 00000000..88f9df63 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/pojo/SimpleStockTakingP.java @@ -0,0 +1,42 @@ +package com.dreamchaser.depository_manage.pojo; + +import com.dreamchaser.depository_manage.entity.StockTaking; +import com.dreamchaser.depository_manage.utils.DateUtil; +import lombok.Data; + +/** + * 用于简化输出 + */ +@Data +public class SimpleStockTakingP { + /** + * id + */ + private Long id; + + /** + * 盘点单号 + */ + private String code; + + /** + * 仓库名称 + */ + private String depositoryName; + + /* + 发起人姓名 + */ + private String originatorName; + + /** + * 申请时间 + */ + private String createTime; + + public SimpleStockTakingP(StockTaking st) { + this.id = st.getId(); + this.code = st.getCode(); + this.createTime = DateUtil.TimeStampToDateTime(st.getCreateTime()); + } +} diff --git a/src/main/java/com/dreamchaser/depository_manage/service/CompanyService.java b/src/main/java/com/dreamchaser/depository_manage/service/CompanyService.java index 155e0d9b..8a933485 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/CompanyService.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/CompanyService.java @@ -1,6 +1,7 @@ package com.dreamchaser.depository_manage.service; import com.dreamchaser.depository_manage.entity.Company; +import com.dreamchaser.depository_manage.entity.UserByPort; import java.util.List; import java.util.Map; @@ -85,4 +86,11 @@ public interface CompanyService { * @return */ Integer updateStateByParam(Map map); + + + /** + * 用于构造部门负责人树 + * @return + */ + List InitTreeMenus(UserByPort userToken); } diff --git a/src/main/java/com/dreamchaser/depository_manage/service/StockTakingService.java b/src/main/java/com/dreamchaser/depository_manage/service/StockTakingService.java new file mode 100644 index 00000000..42716eab --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/service/StockTakingService.java @@ -0,0 +1,108 @@ +package com.dreamchaser.depository_manage.service; + +import com.dreamchaser.depository_manage.entity.StockTaking; +import com.dreamchaser.depository_manage.entity.StockTakingChild; +import com.dreamchaser.depository_manage.entity.UserByPort; +import com.dreamchaser.depository_manage.pojo.SimpleApplicationOutRecordP; +import com.dreamchaser.depository_manage.pojo.SimpleStockTakingP; +import com.dreamchaser.depository_manage.pojo.StockTakingChildP; +import com.dreamchaser.depository_manage.pojo.StockTakingP; +import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +public interface StockTakingService { + /** + * 用于插入盘点记录主表 + * @param map + * @return + */ + Integer insertStockTaking(Map map); + + /** + * 用于插入盘点记录主表 + * @param st + * @return + */ + Integer insertStockTaking(StockTaking st); + + /** + * 根据条件查询自己的任务(根据isDone来决定查询已完成或者未完成的任务),同时支持分页查询(需要begin和size参数) + * @param map 查询参数 + * @return 我的任务 + */ + List findMyTask(Map map, HttpServletRequest request); + + /** + * 查询用户的任务数量 + * @param map + * @return + */ + Integer findMyTaskCount(Map map); + + /** + * 根据条件查询自己的申请 + * @param map 查询参数 + * @return 我的任务 + */ + List findMyApply(Map map, HttpServletRequest request); + + /** + * 查询用户的申请数量 + * @param map + * @return + */ + Integer findMyApplyCount(Map map); + + /** + * 根据主键查询主表 + * @param id + * @return + */ + StockTaking findStockTakingById(Integer id); + + /** + * 根据主键查询主表 + * @param id + * @return + */ + StockTaking findStockTakingById(Long id); + + /** + * 根据主表获取所有子表 + * @param mainId + * @return + */ + List findStockTakingChildPByMainId(Integer mainId); + + /** + * 根据主键获取子表 + * @param id + * @return + */ + StockTakingChildP findStockTakingChildPById(Integer id); + + /** + * 用于对盘点进行审核 + * @param map + * @return + */ + Map review(Map map, UserByPort userToken); + + /** + * 用于进行盘点结果转移 + * @param map + * @return + */ + Integer stockTakingTransfer(Map map,UserByPort userToken); + + /** + * 用于企业微信的审核申请处理 + * @param templateCard + * @return + */ + Integer reviewByQyWx(TemplateCard templateCard); + +} diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/CompanyServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/CompanyServiceImpl.java index 88e9af29..369ab1d0 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/CompanyServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/CompanyServiceImpl.java @@ -1,13 +1,27 @@ package com.dreamchaser.depository_manage.service.impl; -import com.dreamchaser.depository_manage.entity.Company; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.dreamchaser.depository_manage.config.PortConfig; +import com.dreamchaser.depository_manage.entity.*; import com.dreamchaser.depository_manage.mapper.CompanyMapper; +import com.dreamchaser.depository_manage.pojo.AdministrationP; +import com.dreamchaser.depository_manage.pojo.PostP; +import com.dreamchaser.depository_manage.pojo.RoleAndDepository; import com.dreamchaser.depository_manage.service.CompanyService; +import com.dreamchaser.depository_manage.utils.HttpUtils; +import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; +import org.apache.http.protocol.HTTP; +import org.apache.xmlbeans.impl.xb.xsdschema.Public; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.*; @Service public class CompanyServiceImpl implements CompanyService { @@ -130,4 +144,196 @@ public class CompanyServiceImpl implements CompanyService { public Integer updateStateByParam(Map map) { return companyMapper.updateStateByParam(map); } + + /** + * 用于构造部门负责人树 + * @return + */ + @Override + public List InitTreeMenus(UserByPort userToken) { + // 获取当前用户登录的公司 + Map map = new HashMap<>(); + map.put("superior",userToken.getCompany().toString()); + List objectList = FindallCompanyByParent(map,userToken); + // 开启对应数量的线程 + ExecutorService exs = Executors.newFixedThreadPool(objectList.size()); + // 结果集 + List list = new ArrayList<>(); + List> futureList = new ArrayList>(); + + // 1.定义CompletionService + CompletionService completionService = new ExecutorCompletionService(exs); + + for (int i = 0; i < objectList.size(); i++) { + AdministrationP o = objectList.get(i); + Future future = completionService.submit(new Task(o,userToken)); + futureList.add(future); + } + // 3.获取结果 + for(int i=0;i InitTreeMenus(AdministrationP ap, List children){ + if(ap != null) { + Map map = new HashMap<>(); + map.put("title",ap.getName()); + map.put("id", ap.getId()); + map.put("children",children); + return map; + } + else{ + return null; + } + } + + // 根据id获取子类 + public List findChildForMaterialTypeByParent(AdministrationP ap,UserByPort userByPort){ + Map param = new HashMap<>(); + List result = new ArrayList<>(); + Map children = new HashMap<>(); + param.put("superior",ap.getId().toString()); + // 获取当前父类的子类 + List administrationPList = FindallCompanyByParent(param, userByPort); + if(administrationPList.size() > 0){ + // 如果还有部门 + for (int i = 0; i < administrationPList.size(); i++) { + AdministrationP administrationP = administrationPList.get(i); + List childForMaterialTypeByParent = findChildForMaterialTypeByParent(administrationP,userByPort); + if(childForMaterialTypeByParent != null && administrationP.getLevel() != 4) { + // 如果子类不为空 + result.add(InitTreeMenus(administrationP, childForMaterialTypeByParent)); + }else{ + // 为当前部门添加部门负责人 + List objectList = addDepartMentHead(administrationP, userByPort); + result.add(InitTreeMenus(administrationP,objectList)); + } + } + return result; + }else{ + return null; + } + } + + // 用于执行线程任务 + class Task implements Callable { + + AdministrationP ap; + UserByPort userByPort; + + public Task(AdministrationP ap,UserByPort userByPort){ + this.ap = ap; + this.userByPort = userByPort; + } + @Override + public Object call() throws Exception { + List childForMaterialTypeByParent = findChildForMaterialTypeByParent(ap,userByPort); + Map stringObjectMap = InitTreeMenus(ap,childForMaterialTypeByParent); + return stringObjectMap; + } + } + + + /** + * 用于给当前部门添加部门负责人 + * @param ap + * @return + */ + public List addDepartMentHead(AdministrationP ap,UserByPort userToken){ + // 获取当前部门的部门负责人 + Map map = new HashMap<>(); + map.put("adminorg",ap.getId()); + List departmentHeadByUser = findDepartmentHeadByUser(map, userToken); + List result = new ArrayList<>(); + for (int i = 0; i < departmentHeadByUser.size(); i++) { + UserByPort user = departmentHeadByUser.get(i); + Map children = new HashMap<>(); + children.put("title",user.getName()); + children.put("id",user.getId()); + result.add(children); + } + return result; + } + + + /** + * 用于获取当前行政组织的子类 + * @param map + * @param userToken + * @return + */ + public List FindallCompanyByParent(Map map, UserByPort userToken){ + String url = PortConfig.external_url +"/org/govlist"; + String superior = (String) map.get("superior"); + if(superior == null || "".equals(superior)){ + superior = "313"; + } + map.put("superior",superior); + map.put("state",1); + String jsonString = JSONObject.toJSONString(map); + JSONObject paramObject = JSONObject.parseObject(jsonString); + String post = null; + try { + post = HttpUtils.send(url,paramObject, HTTP.UTF_8,userToken); + } catch (IOException e) { + e.printStackTrace(); + } + JSONObject jsonObject = JSONObject.parseObject(post); + JSONObject data = (JSONObject) jsonObject.get("data"); + JSONArray list = (JSONArray) data.get("list"); + if(list == null){ + list = new JSONArray(); + } + List administrationPList = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + Administration administration = JSONObject.toJavaObject((JSONObject)list.get(i), Administration.class); + AdministrationP administrationP = new AdministrationP(administration); + administrationPList.add(administrationP); + } + return administrationPList; + } + + + /** + * 用于获取当前部门的负责人 + * @param map + * @param userToken + * @return + */ + public List findDepartmentHeadByUser(Map map,UserByPort userToken){ + String url = PortConfig.external_url + "/staff/archiveslist"; + String jsonString = JSONObject.toJSONString(map); + JSONObject paramObject = JSONObject.parseObject(jsonString); + String post = null; + try { + post = HttpUtils.send(url, paramObject, HTTP.UTF_8,userToken); + } catch (IOException e) { + e.printStackTrace(); + } + JSONObject jsonObject = JSONObject.parseObject(post); + JSONObject data = (JSONObject) jsonObject.get("data"); + JSONArray list = (JSONArray) data.get("list"); + if(list == null){ + list = new JSONArray(); + } + List DepartmentHeads = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + UserByPort userByPort = JSONObject.toJavaObject((JSONObject) list.get(i), UserByPort.class); + if(userByPort.getPersonincharge() == 1){ + DepartmentHeads.add(userByPort); + } + } + return DepartmentHeads; + } } diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java index 4020516f..12533976 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java @@ -1,11 +1,6 @@ package com.dreamchaser.depository_manage.service.impl; -import cn.hutool.core.util.IdUtil; -import cn.hutool.db.Page; -import cn.hutool.log.Log; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.extension.api.R; import com.dreamchaser.depository_manage.config.PortConfig; import com.dreamchaser.depository_manage.controller.PageController; import com.dreamchaser.depository_manage.entity.*; @@ -13,24 +8,15 @@ import com.dreamchaser.depository_manage.exception.MyException; import com.dreamchaser.depository_manage.mapper.*; import com.dreamchaser.depository_manage.pojo.*; import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard; -import com.dreamchaser.depository_manage.security.bean.UserToken; import com.dreamchaser.depository_manage.service.DepositoryRecordService; -import com.dreamchaser.depository_manage.service.MaterialTypeService; import com.dreamchaser.depository_manage.service.RoleService; import com.dreamchaser.depository_manage.utils.*; -import org.apache.http.protocol.HTTP; -import org.apache.poi.ss.formula.functions.T; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; -import org.springframework.beans.Mergeable; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.DataAccessException; -import org.springframework.data.redis.core.RedisOperations; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.SessionCallback; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import cn.hutool.core.lang.Snowflake; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @@ -38,7 +24,6 @@ import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; /** * @author Dreamchaser @@ -103,7 +88,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { @Override public Integer applicationIn(Map map) { Integer depositoryId = ObjectFormatUtil.toInteger(map.get("depositoryId")); - Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId); + Depository depositoryRecordById = depositoryMapper.findDepositoryById(depositoryId); Map temp = new HashMap<>(); temp.put("dname", depositoryRecordById.getDname()); temp.put("dcode", depositoryRecordById.getCode()); @@ -148,7 +133,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { insert.put("price", avgPrice); insert.put("mname", materialById.getMname()); insert.put("quantity", quantity); - insert.put("materialTypeId", materialById.getTypeId()); + insert.put("materialTypeId", materialById.getMaterialTypeId()); insert.put("code", materialById.getCode()); insert.put("unit", materialById.getUnit()); insert.put("version", materialById.getVersion()); @@ -197,7 +182,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { } update.put("numberOfTemporary", numberOfTemporary + quantity); materialMapper.updateMaterial(update); - Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(materialById.getDepositoryId()); + Depository depositoryRecordById = depositoryMapper.findDepositoryById(materialById.getDepositoryId()); dname = depositoryRecordById.getDname(); } @@ -566,7 +551,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { } // 获取出库仓库信息 - Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(applicationOutMinById.getDepositoryId()); + Depository depositoryRecordById = depositoryMapper.findDepositoryById(applicationOutMinById.getDepositoryId()); // 设置子订单新编码 // 获取主订单单号 StringBuilder code = new StringBuilder(record.getCode()); @@ -687,7 +672,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { map.remove("id"); map.put("transferId", transferId); // 获取当前转移物料仓库 - Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(material.getDepositoryId()); + Depository depositoryRecordById = depositoryMapper.findDepositoryById(material.getDepositoryId()); Administration company = PageController.getCompany(userByPort.getMaindeparment(), userByPort); // 生成出库订单 map.put("code", createCode(depositoryRecordById.getDname(), "outOrderNumber", "out", company.getName())); @@ -742,7 +727,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { new Thread(new Runnable() { @Override public void run() { - JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(id), false); + JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(id), false); // 将当前返回结果保存到redis中 Map QyWxMessageMap = new HashMap<>(); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); @@ -921,7 +906,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { QyWxUid.append("PangFuZhen"+","); map.put("depositoryManager", depositoryManager.toString()); // 向仓储中心负责人发送新的消息 - JSONObject jsonObject = qyWxOperationService.sendQyWxMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(outId), false); + JSONObject jsonObject = qyWxOperationService.sendQyWxToApplicationOutMessage(QyWxUid.toString(), ObjectFormatUtil.toInteger(outId), false); // 将当前返回结果保存到redis中 Map QyWxMessageMap = new HashMap<>(); QyWxMessageMap.put("MsgId",jsonObject.getString("msgid")); @@ -1049,7 +1034,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { insert.put("price", materialById.getPrice()); insert.put("mname", materialById.getMname()); insert.put("quantity", quantity); - insert.put("materialTypeId", materialById.getTypeId()); + insert.put("materialTypeId", materialById.getMaterialTypeId()); insert.put("code", materialById.getCode()); insert.put("unit", materialById.getUnit()); insert.put("version", materialById.getVersion()); diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java index ec19fc8c..4aeace85 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java @@ -1,6 +1,5 @@ package com.dreamchaser.depository_manage.service.impl; -import cn.hutool.db.Page; import com.dreamchaser.depository_manage.controller.PageController; import com.dreamchaser.depository_manage.entity.*; import com.dreamchaser.depository_manage.mapper.DepositoryMapper; @@ -12,7 +11,6 @@ import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; import com.dreamchaser.depository_manage.utils.WordUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.thymeleaf.util.ArrayUtils; import java.util.ArrayList; import java.util.HashMap; @@ -83,7 +81,7 @@ public class DepositoryServiceImpl implements DepositoryService { map.remove("depositoryId"); // 获取当前仓库父仓库 Integer parentId = ObjectFormatUtil.toInteger(map.get("parentId")); - Depository depositoryId = depositoryMapper.findDepositoryRecordById(parentId); + Depository depositoryId = depositoryMapper.findDepositoryById(parentId); // 获取当前选择部门 String adminorgName = ""; // 部门编号 @@ -186,7 +184,7 @@ public class DepositoryServiceImpl implements DepositoryService { */ @Override public Depository findDepositoryRecordById(Integer id) { - return depositoryMapper.findDepositoryRecordById(id); + return depositoryMapper.findDepositoryById(id); } /** @@ -284,7 +282,7 @@ public class DepositoryServiceImpl implements DepositoryService { Map map = new HashMap<>(); for (int i = 0; i < depositoryListId.size(); i++) { Integer depositoryId = depositoryListId.get(i); - Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId); + Depository depositoryRecordById = depositoryMapper.findDepositoryById(depositoryId); map.put(depositoryRecordById.getDname() + "," + depositoryRecordById.getCode(), depositoryRecordById.getId()); } @@ -481,7 +479,7 @@ public class DepositoryServiceImpl implements DepositoryService { for (int i = 0; i < depositoryAndRole.size(); i++) { RoleAndDepository roleAndDepository = depositoryAndRole.get(i); - Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(roleAndDepository.getDepositoryId()); + Depository depositoryRecordById = depositoryMapper.findDepositoryById(roleAndDepository.getDepositoryId()); // 如果重复则跳过 if (hasDepository(depositoryList,depositoryRecordById)) { continue; diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java index 4eccec16..4316a94b 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java @@ -282,7 +282,7 @@ public class ExcelServiceImpl implements ExcelService { Map insert = new HashMap<>(); Integer depositoryId = excelVos.get(i).getDepositoryId(); insert.put("mname", materialByCode.getMname()); - insert.put("materialTypeId", materialByCode.getTypeId()); + insert.put("materialTypeId", materialByCode.getMaterialTypeId()); insert.put("state", materialByCode.getState()); insert.put("code", materialByCode.getCode()); insert.put("unit", materialByCode.getUnit()); diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java index 690d805f..52efef89 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java @@ -1,26 +1,19 @@ package com.dreamchaser.depository_manage.service.impl; -import com.alibaba.fastjson.JSONObject; -import com.dreamchaser.depository_manage.config.PortConfig; import com.dreamchaser.depository_manage.entity.*; import com.dreamchaser.depository_manage.mapper.DepositoryMapper; import com.dreamchaser.depository_manage.mapper.MaterialMapper; import com.dreamchaser.depository_manage.mapper.MaterialTypeMapper; -import com.dreamchaser.depository_manage.pojo.DepositoryRecordP; import com.dreamchaser.depository_manage.pojo.MaterialP; import com.dreamchaser.depository_manage.pojo.PlaceP; import com.dreamchaser.depository_manage.service.MaterialService; import com.dreamchaser.depository_manage.service.PlaceService; import com.dreamchaser.depository_manage.service.RoleService; -import com.dreamchaser.depository_manage.utils.HttpUtils; import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; -import com.dreamchaser.depository_manage.utils.TaskCenterUtil; -import org.apache.http.protocol.HTTP; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.io.IOException; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; @@ -108,10 +101,9 @@ public class MaterialServiceImpl implements MaterialService { } map.put("price",price); } - if(map.containsKey("materialTypeId")) { - map.put("typeId", map.get("materialTypeId")); - map.remove("materialTypeId"); - } + + + return materialMapper.updateMaterial(map); } @@ -159,7 +151,7 @@ public class MaterialServiceImpl implements MaterialService { } if(depositoryId != null){ - Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId); + Depository depositoryRecordById = depositoryMapper.findDepositoryById(depositoryId); String code = depositoryRecordById.getCode(); list.get(i).setDepositoryCode(code); } @@ -198,7 +190,7 @@ public class MaterialServiceImpl implements MaterialService { placeCode.append(placeByMidAndDid.get(j).getCode()).append(" "); } if(depositoryId != null){ - Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId); + Depository depositoryRecordById = depositoryMapper.findDepositoryById(depositoryId); String code = depositoryRecordById.getCode(); list.get(i).setDepositoryCode(code); } @@ -251,7 +243,7 @@ public class MaterialServiceImpl implements MaterialService { @Override public Material findMaterialById(int id) { Material material = materialMapper.findMaterialById(id); - MaterialType materialTypeByOldId = materialTypeMapper.findMaterialTypeByOldId(material.getTypeId()); + MaterialType materialTypeByOldId = materialTypeMapper.findMaterialTypeByOldId(material.getMaterialTypeId()); material.setTypeName(materialTypeByOldId.getTname()); material.setPrice(material.getPrice() / 100); material.setAmounts(material.getAmounts() / 100); @@ -364,7 +356,7 @@ public class MaterialServiceImpl implements MaterialService { m.setDepositoryName(depositoryMapper.findDepositoryNameById(depositoryId)); m.setWarehouseManager(depositoryMapper.findUserNameByDepositoryId(depositoryId)); } - MaterialType materialTypeByOldId = materialTypeMapper.findMaterialTypeByOldId(material.getTypeId()); + MaterialType materialTypeByOldId = materialTypeMapper.findMaterialTypeByOldId(material.getMaterialTypeId()); m.setTypeName(materialTypeByOldId.getTname()); m.setTypeId(materialTypeByOldId.getOldId()); result.add(m); @@ -392,7 +384,7 @@ public class MaterialServiceImpl implements MaterialService { map.put("size", size); } Integer depositoryId = ObjectFormatUtil.toInteger(map.get("depositoryId")); - Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId); + Depository depositoryRecordById = depositoryMapper.findDepositoryById(depositoryId); List materialByDepository = materialMapper.findMaterialByDepository(map); for (int i = 0; i < materialByDepository.size(); i++) { materialByDepository.get(i).setDepositoryCode(depositoryRecordById.getCode()); @@ -839,11 +831,20 @@ public class MaterialServiceImpl implements MaterialService { List materialPByCondition = new ArrayList<>(); List dids = new ArrayList<>(); if("0".equals(placeId)){ - // 如果要盘点的位置是默认库位 + // 获取当前库位下的所有物料 dids.add(ObjectFormatUtil.toInteger(depositoryId)); param.put("list",dids); // 获取当前类别下的物料 - materialPByCondition = materialMapper.findMaterialByDepositorysAndType(param); + List materialByDepositorysAndType = materialMapper.findMaterialByDepositorysAndType(param); + for (int i = 0; i < materialByDepositorysAndType.size(); i++) { + Material material = materialByDepositorysAndType.get(i); + Map map = new HashMap<>(); + MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(0, material.getId()); + if(placeAndMaterialByMidAndPid != null){ + materialPByCondition.add(material); + } + } + }else{ // 如果要盘点的位置是某个库位 Integer pid = ObjectFormatUtil.toInteger(placeId); @@ -851,7 +852,15 @@ public class MaterialServiceImpl implements MaterialService { // 获取当前仓库下的所有物料库存 dids.add(placeById.getDid()); param.put("list",dids); - materialPByCondition = materialMapper.findMaterialByDepositorysAndType(param); + List materialByDepositorysAndType = materialMapper.findMaterialByDepositorysAndType(param); + for (int i = 0; i < materialByDepositorysAndType.size(); i++) { + Material material = materialByDepositorysAndType.get(i); + Map map = new HashMap<>(); + MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(pid, material.getId()); + if(placeAndMaterialByMidAndPid != null){ + materialPByCondition.add(material); + } + } } List result = new ArrayList<>(); if("".equals(mname)) { // 如果没有输入名称 diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/QyWxOperationService.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/QyWxOperationService.java index 19c70e50..a5925721 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/QyWxOperationService.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/QyWxOperationService.java @@ -7,14 +7,12 @@ import com.dreamchaser.depository_manage.config.QyWxConfig; import com.dreamchaser.depository_manage.config.QyWx_template_card.*; import com.dreamchaser.depository_manage.controller.PageController; import com.dreamchaser.depository_manage.entity.*; -import com.dreamchaser.depository_manage.mapper.DepositoryMapper; -import com.dreamchaser.depository_manage.mapper.DepositoryRecordMapper; -import com.dreamchaser.depository_manage.mapper.MaterialMapper; +import com.dreamchaser.depository_manage.mapper.*; import com.dreamchaser.depository_manage.pojo.ApplicationOutRecordP; -import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard; +import com.dreamchaser.depository_manage.pojo.StockTakingChildP; import com.dreamchaser.depository_manage.utils.DateUtil; import com.dreamchaser.depository_manage.utils.HttpUtils; -import org.apache.poi.ss.formula.functions.T; +import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @@ -39,16 +37,23 @@ public class QyWxOperationService { DepositoryMapper depositoryMapper; @Autowired - RedisTemplate redisTemplate; + RedisTemplate redisTemplate; + + @Autowired + StockTakingMapper stockTakingMapper; + + @Autowired + PlaceMapper placeMapper; /** - * 用于向企业微信发送消息 - * @param uid 接收人 + * 用于向企业微信发送出库消息 + * + * @param uid 接收人 * @param outId 申请出库编号 - * @param flag 用于判断发送类型是部门负责人还是仓储负责人(true为部门,false为仓储) + * @param flag 用于判断发送类型是部门负责人还是仓储负责人(true为部门,false为仓储) * @return */ - public JSONObject sendQyWxMessage(String uid, Integer outId, Boolean flag) { + public JSONObject sendQyWxToApplicationOutMessage(String uid, Integer outId, Boolean flag) { // 获取将要发送申请的订单记录 ApplicationOutRecordP applicationOutRecordPById = depositoryRecordMapper.findApplicationOutRecordPById(outId); @@ -68,14 +73,14 @@ public class QyWxOperationService { // 获取当前申请物料 Material materialById = materialMapper.findMaterialById(applicationOutRecordMin.getMid()); // 获取当前物料所在仓库 - Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(materialById.getDepositoryId()); + Depository depositoryRecordById = depositoryMapper.findDepositoryById(materialById.getDepositoryId()); sumQuantity.append(applicationOutRecordMin.getQuantity()).append(","); mname.append(materialById.getMname()).append(","); depositoryName.append(depositoryRecordById.getDname()).append(","); } // 1.获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url - String accessToken = "".equals(QyWxConfig.token)?QyWxConfig.GetQYWXToken():QyWxConfig.token; + String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token; // 2.获取发送对象,并转成json ButtonInteraction buttonInteraction = new ButtonInteraction(); // 1.1非必需 @@ -118,8 +123,8 @@ public class QyWxOperationService { // 一级标题 TemplateCard_main_title main_title = new TemplateCard_main_title(); // main_title.setTitle(applicant+"的出库申请"); - main_title.setTitle(applicant.getName()+"的出库申请"); - main_title.setDesc("申请时间:"+ DateUtil.TimeStampToDateTime(Long.valueOf(applicationOutRecordPById.getApplicantTime()))); + main_title.setTitle(applicant.getName() + "的出库申请"); + main_title.setDesc("申请时间:" + DateUtil.TimeStampToDateTime(Long.valueOf(applicationOutRecordPById.getApplicantTime()))); // 设置一级标题 templateCard_button_interaction.setMain_title(main_title); @@ -156,7 +161,7 @@ public class QyWxOperationService { // 二级标题 horizontal_content_detail.setKeyname("申请明细"); horizontal_content_detail.setValue("查看明细"); - horizontal_content_detail.setUrl("https://jy.hxgk.group/ApplicationOutView?id="+outId); + horizontal_content_detail.setUrl("https://jy.hxgk.group/ApplicationOutView?id=" + outId); List horizontal_contentList = new ArrayList<>(); @@ -171,7 +176,7 @@ public class QyWxOperationService { // 任务id,同一个应用任务id不能重复,只能由数字、字母和“_-@”组成,最长128字节 // 通过雪花算法获取taskId - Snowflake snowflake = new Snowflake(10,10,true); + Snowflake snowflake = new Snowflake(10, 10, true); templateCard_button_interaction.setTask_id(snowflake.nextIdStr()); // 下拉式的选择器 @@ -184,10 +189,10 @@ public class QyWxOperationService { // 选项 TemplateCard_button_selection_option button_selection_option = new TemplateCard_button_selection_option(); button_selection_option.setText("部门负责人"); - if(flag) { + if (flag) { // 如果是发送给部门负责人 button_selection_option.setId("btn_status_departManagerHead"); - }else{ + } else { // 如果是发送给仓储负责人 button_selection_option.setId("btn_status_depositoryManager"); } @@ -201,12 +206,258 @@ public class QyWxOperationService { List buttonList = new ArrayList<>(); TemplateCard_button button1 = new TemplateCard_button(); - button1.setKey("wms_pass_outId"+outId); + button1.setKey("wms_pass_outId" + outId); button1.setStyle(1); button1.setText("通过"); TemplateCard_button button2 = new TemplateCard_button(); - button2.setKey("wms_reject_outId"+outId); + button2.setKey("wms_reject_outId" + outId); + button2.setStyle(2); + button2.setText("驳回"); + + buttonList.add(button1); + buttonList.add(button2); + + templateCard_button_interaction.setButton_list(buttonList); + + buttonInteraction.setTemplate_card(templateCard_button_interaction); + + String s = JSONObject.toJSONString(buttonInteraction); + + // 3.获取请求的url + String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken); + + // 4.调用接口,发送消息 + String s1 = HttpUtils.doPost(url, s); + + // 将返回结果转为json对象 + JSONObject jsonObject = JSON.parseObject(s1); + + // 返回 + return jsonObject; + } + + + /** + * 用于向企业微信发送盘点消息 + * @param uid 接收人 + * @param mainId 盘点记录编号 + * @return + */ + public JSONObject sendQyWxToStockTakingMessage(String uid,Integer mainId){ + // 获取盘点主记录 + StockTaking mainRecord = stockTakingMapper.selectStockTakingById(mainId); + + // 获取所有子记录 + List minRecordList = stockTakingMapper.selectStockTakingChildByMainId(mainId); + + // 申请人id + Integer getOriginator = mainRecord.getOriginator(); + // 申请人 + UserByPort originator = PageController.FindUserById(getOriginator, null); + + // 盘点物料名称 + StringBuilder mname = new StringBuilder(); + // 盘点位置 + StringBuilder Location = new StringBuilder(); + // 物料盘点数量 + StringBuilder stockTakingQuantity = new StringBuilder(); + // 物料盘点结果 + StringBuilder stockTakingResult = new StringBuilder(); + // 物料盘盈数量 + StringBuilder stockTakingInventory = new StringBuilder(); + // 获取盘点的库位 + Integer placeId = mainRecord.getPlaceId(); + Place place = placeMapper.findPlaceById(placeId); + + // 获取盘点的仓库 + Integer depositoryId = mainRecord.getDepositoryId(); + Depository depository = depositoryMapper.findDepositoryById(depositoryId); + + Location.append(depository.getDname()); + if(Integer.compare(0,placeId) == 0){ + // 如果盘点库位为默认库位 + + Location.append(" - 默认库位"); + + }else{ + Location.append(" - ").append(place.getCode()); + } + + for (int i = 0; i < minRecordList.size(); i++) { + // 获取子订单信息 + StockTakingChildP childP = minRecordList.get(i); + // 获取当前申请物料 + Material materialById = materialMapper.findMaterialById(childP.getMid()); + // 设置物料名称 + mname.append(materialById.getMname()).append(","); + // 设置盘点数量 + stockTakingQuantity.append(childP.getNewInventory()).append(","); + // 设置盘点结果 + String takingResult = childP.getTakingResult(); + if("Inventory_up".equals(takingResult)){ + takingResult = "盘盈"; + }else if("Inventory_down".equals(takingResult)){ + takingResult = "盘亏"; + }else if("Inventory_normal".equals(takingResult)){ + takingResult = "正常"; + } + stockTakingResult.append(takingResult).append(","); + // 设置盈亏数量 + stockTakingInventory.append(childP.getInventory()).append(","); + } + + // 1.获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url + String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token; + // 2.获取发送对象,并转成json + ButtonInteraction buttonInteraction = new ButtonInteraction(); + // 1.1非必需 + //设置消息接收者 + String[] split = uid.split(","); + StringBuilder toUserName = new StringBuilder(); + for (int i = 0; i < split.length - 1; i++) { + toUserName.append(split[i]).append("|"); + } + toUserName.append(split[split.length - 1]); + buttonInteraction.setTouser(toUserName.toString()); // 不区分大小写 + + // 1.2必需 + // 消息类型 + buttonInteraction.setMsgtype("template_card"); + // 企业应用的id,整型 + buttonInteraction.setAgentid(QyWxConfig.AgentId); + // 卡片模板 + TemplateCard_button_interaction templateCard_button_interaction = new TemplateCard_button_interaction(); + // 模板卡片类型,按钮交互型卡片填写"button_interaction" + templateCard_button_interaction.setCard_type("button_interaction"); + // 卡片右上角更多操作按钮 + TemplateCard_action_menu action_menu = new TemplateCard_action_menu(); + action_menu.setDesc("卡片副交互辅助文本说明"); + + // 卡片右上角操作按钮 + TemplateCard_action action1 = new TemplateCard_action(); + action1.setKey("AcceptThePush"); + action1.setText("接受推送"); + TemplateCard_action action2 = new TemplateCard_action(); + action2.setKey("NoPush"); + action2.setText("不再推送"); + List actionList = new ArrayList<>(); + actionList.add(action1); + actionList.add(action2); + action_menu.setAction_list(actionList); + // 设置操作按钮 + templateCard_button_interaction.setAction_menu(action_menu); + + // 一级标题 + TemplateCard_main_title main_title = new TemplateCard_main_title(); +// main_title.setTitle(applicant+"的出库申请"); + main_title.setTitle(originator.getName() + "的仓库盘点"); + main_title.setDesc("申请时间:" + DateUtil.TimeStampToDateTime(Long.valueOf(mainRecord.getCreateTime()))); + + // 设置一级标题 + templateCard_button_interaction.setMain_title(main_title); + + + // 二级标题+文本列表,用于设置盘点位置 + TemplateCard_horizontal_content horizontal_content_Location = new TemplateCard_horizontal_content(); + // 链接类型 0代表不是链接 + horizontal_content_Location.setType(0); + // 二级标题 + horizontal_content_Location.setKeyname("盘点位置"); + horizontal_content_Location.setValue(Location.toString()); + + // 二级标题+文本列表,用于设置物料名称 + TemplateCard_horizontal_content horizontal_content_mname = new TemplateCard_horizontal_content(); + // 链接类型 0代表不是链接 + horizontal_content_mname.setType(0); + // 二级标题 + horizontal_content_mname.setKeyname("盘点物料:"); + horizontal_content_mname.setValue(mname.toString()); + + // 二级标题+文本列表,用于设置盘点数量 + TemplateCard_horizontal_content horizontal_content_quantity = new TemplateCard_horizontal_content(); + // 链接类型 0代表不是链接 + horizontal_content_quantity.setType(0); + // 二级标题 + horizontal_content_quantity.setKeyname("盘点数量"); + horizontal_content_quantity.setValue(stockTakingQuantity.toString()); + + // 二级标题+文本列表,用于设置盘点结果 + TemplateCard_horizontal_content horizontal_content_result = new TemplateCard_horizontal_content(); + // 链接类型 0代表不是链接 + horizontal_content_result.setType(0); + // 二级标题 + horizontal_content_result.setKeyname("盘点结果"); + horizontal_content_result.setValue(stockTakingResult.toString()); + + // 二级标题+文本列表,用于设置盈亏数目 + TemplateCard_horizontal_content horizontal_content_inventory = new TemplateCard_horizontal_content(); + // 链接类型 0代表不是链接 + horizontal_content_inventory.setType(0); + // 二级标题 + horizontal_content_inventory.setKeyname("盈亏数量"); + horizontal_content_inventory.setValue(stockTakingInventory.toString()); + + + + + // 二级标题+文本列表,用于设置申请查看明细 + TemplateCard_horizontal_content horizontal_content_detail = new TemplateCard_horizontal_content(); + // 链接类型 0代表不是链接 + horizontal_content_detail.setType(1); + // 二级标题 + horizontal_content_detail.setKeyname("盘点明细"); + horizontal_content_detail.setValue("查看明细"); + horizontal_content_detail.setUrl("https://jy.hxgk.group/StockTakingView?id=" + mainId); + + + List horizontal_contentList = new ArrayList<>(); + horizontal_contentList.add(horizontal_content_mname); + horizontal_contentList.add(horizontal_content_quantity); + horizontal_contentList.add(horizontal_content_Location); + horizontal_contentList.add(horizontal_content_result); + horizontal_contentList.add(horizontal_content_inventory); + horizontal_contentList.add(horizontal_content_detail); + + // 设置二级标题 + templateCard_button_interaction.setHorizontal_content_list(horizontal_contentList); + + + // 任务id,同一个应用任务id不能重复,只能由数字、字母和“_-@”组成,最长128字节 + // 通过雪花算法获取taskId + Snowflake snowflake = new Snowflake(10, 10, true); + templateCard_button_interaction.setTask_id(snowflake.nextIdStr()); + + // 下拉式的选择器 + TemplateCard_button_selection button_selection = new TemplateCard_button_selection(); + // 下拉式的选择器的key + button_selection.setQuestion_key("btn_status"); + button_selection.setTitle("您的身份"); + + List optionList = new ArrayList<>(); + // 选项 + TemplateCard_button_selection_option button_selection_option = new TemplateCard_button_selection_option(); + button_selection_option.setText("负责人"); + + // 如果是发送给部门负责人 + button_selection_option.setId("btn_status_departManagerHead"); + + optionList.add(button_selection_option); + + button_selection.setOption_list(optionList); + + templateCard_button_interaction.setButton_selection(button_selection); + + // 按钮列表,列表长度不超过6 + List buttonList = new ArrayList<>(); + + TemplateCard_button button1 = new TemplateCard_button(); + button1.setKey("wms_pass_StockTakingId" + mainId); + button1.setStyle(1); + button1.setText("通过"); + + TemplateCard_button button2 = new TemplateCard_button(); + button2.setKey("wms_reject_StockTakingId" + mainId); button2.setStyle(2); button2.setText("驳回"); @@ -235,11 +486,12 @@ public class QyWxOperationService { /** * 将最终完成的订单抄送给仓储负责人 - * @param uid 仓储负责人编号 + * + * @param uid 仓储负责人编号 * @param outId 订单编号 * @return */ - public JSONObject sendCcMessageToUsers(String uid,Integer outId){ + public JSONObject sendCcMessageToUsers(String uid, Integer outId) { // 获取已经完成的订单 ApplicationOutRecordP recordP = depositoryRecordMapper.findApplicationOutRecordPById(outId); // 申请人id @@ -249,6 +501,7 @@ public class QyWxOperationService { // 获取所有子订单 List applicationOutRecordMinByParent = depositoryRecordMapper.findApplicationOutRecordMinByParent(outId); + MessageByMarkDown markDown = new MessageByMarkDown(); //设置消息接收者 String[] split = uid.split(","); @@ -260,23 +513,22 @@ public class QyWxOperationService { markDown.setTouser(toUserName.toString()); // 不区分大小写 - // 设置agentId markDown.setAgentid(QyWxConfig.AgentId); markDown.setMsgtype("markdown"); // 设置content - Map markdown = new HashMap<>(); + Map markdown = new HashMap<>(); StringBuilder content = new StringBuilder("## `抄送信息:`%n"); - content.append(">### **"+applicant.getName()+"的出库申请** %n申请时间:2022-10-23 14:30:18 %n"); + content.append(">### **" + applicant.getName() + "的出库申请** %n申请时间:" + recordP.getApplicantTime() + " %n"); content.append("%n---%n"); for (ApplicationOutRecordMin recordMin : applicationOutRecordMinByParent) { // 获取子订单信息 // 获取申请物料信息 Material materialById = materialMapper.findMaterialById(recordMin.getMid()); // 获取仓库信息 - Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(recordMin.getDepositoryId()); + Depository depositoryRecordById = depositoryMapper.findDepositoryById(recordMin.getDepositoryId()); // 获取处理人信息 UserByPort userByPort = PageController.FindUserById(recordMin.getCheckId(), null); content.append(">- 物料名称:").append(materialById.getMname()).append("%n"); @@ -286,15 +538,146 @@ public class QyWxOperationService { content.append("%n---%n"); } content.append(">## '''%n" + - ">如需要查看详细信息,请点击:[查看信息](https://jy.hxgk.group/ApplicationOutView?id="+recordP.getId()+")"); - markdown.put("content",content.toString()); + ">如需要查看详细信息,请点击:[查看信息](https://jy.hxgk.group/ApplicationOutView?id=" + recordP.getId() + ")"); + markdown.put("content", content.toString()); + markDown.setMarkdown(markdown); + String jsonString = JSONObject.toJSONString(markDown); + jsonString = String.format(jsonString); + System.out.println(jsonString); + // 3.获取请求的url + // 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url + String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token; + String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken); + + // 4.调用接口,发送消息 + String s1 = HttpUtils.doPost(url, jsonString); + + // 将返回结果转为json对象 + JSONObject jsonObject = JSON.parseObject(s1); + + // 返回 + return jsonObject; + } + + + /** + * 将盘点记录抄送给负责人 + * + * @param uid + * @param map + * @return + */ + public JSONObject sendCcStockTakingMessageToHead(String uid, Map map, UserByPort userToken, StockTaking mainRecord) { + + /** + * 获取要转移的订单 + */ + List minIds = (List) map.get("minIds"); + + MessageByMarkDown markDown = new MessageByMarkDown(); + //设置消息接收者 + String[] split = uid.split(","); + StringBuilder toUserName = new StringBuilder(); + for (int i = 0; i < split.length - 1; i++) { + toUserName.append(split[i]).append("|"); + } + toUserName.append(split[split.length - 1]); + markDown.setTouser(toUserName.toString()); // 不区分大小写 + + + // 设置agentId + markDown.setAgentid(QyWxConfig.AgentId); + markDown.setMsgtype("markdown"); + + + Map markdown = new HashMap<>(); + // 抄送内容 + StringBuilder content = new StringBuilder("## `抄送信息:`%n"); + // 获取发起人信息 + UserByPort originator = PageController.FindUserById(mainRecord.getOriginator(), userToken); + + // 设置content + content.append(">### **" + originator.getName() + "的物料转移记录** %n时间:" + DateUtil.TimeStampToDateTime(mainRecord.getCreateTime()) + " %n"); + content.append("%n---%n"); + + + for (int i = 0; i < minIds.size(); i++) { + Integer minId = minIds.get(i); + // 获取对应子订单 + StockTakingChildP minRecord = stockTakingMapper.selectStockTakingChildPById(minId); + + // 获取当前物料 + Material material = materialMapper.findMaterialById(minRecord.getMid()); + + + // 获取转移数量 + Integer inventory = ObjectFormatUtil.toInteger(map.get("inventory")); + // 获取转移前的库位 + Integer oldPlaceId = ObjectFormatUtil.toInteger(mainRecord.getPlaceId()); + Place oldPlace = placeMapper.findPlaceById(oldPlaceId); + + + // 获取转移后的数量 + Integer newInventory = minRecord.getNewInventory() - inventory; + // 获取转移到的库位 + Integer newPlaceId = ObjectFormatUtil.toInteger(map.get("placeId")); + Place newPlace = placeMapper.findPlaceById(newPlaceId); + + + // 盘点位置 + String fromLocation = ""; + // 转移位置 + String toLocation = ""; + // 获取转移前的仓库 + Depository fromDepository = depositoryMapper.findDepositoryById(oldPlace.getDid()); + // 获取转移后的仓库 + Depository toDepository = depositoryMapper.findDepositoryById(newPlace.getDid()); + + if(Integer.compare(0,oldPlaceId) == 0){ + // 如果转移前的位置为默认库位 + fromLocation = fromDepository.getDname() + " - 默认库位"; + }else{ + fromLocation = fromDepository.getDname() + " - "+oldPlace.getCode(); + } + + if(Integer.compare(0,newPlaceId) == 0){ + // 如果转移后的位置为默认库位 + toLocation = toDepository.getDname() + " - 默认库位"; + }else{ + toLocation = toDepository.getDname() + " - "+newPlace.getCode(); + } + + //获取物料与转移前库位的对应关系 + Map paramForMaterialAndPlace = new HashMap<>(); + paramForMaterialAndPlace.put("mid",material.getId()); + paramForMaterialAndPlace.put("pid",oldPlace.getId()); + MaterialAndPlace oldPlaceAndMaterial = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace); + //获取物料与转移后库位的对应关系 + paramForMaterialAndPlace.put("pid",newPlace.getId()); + MaterialAndPlace newPlaceAndMaterial = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace); + + + + content.append(">- 物料名称:").append(material.getMname()).append("%n"); + content.append(">- 盘点数量:").append(minRecord.getNewInventory()).append("%n"); + content.append(">- 盘点位置:").append(fromLocation).append("%n"); + content.append(">- 转移数量:").append(map.get("inventory")).append("%n"); + content.append(">- 转移位置:").append(toLocation).append("%n"); + content.append(">- 转移后盘点位置物料数量:").append(oldPlaceAndMaterial.getQuantity()).append("%n"); + content.append(">- 转移位置物料数量:").append(newPlaceAndMaterial.getQuantity()).append("%n"); + content.append("%n---%n"); + } + content.append(">## '''%n" + + ">如需要查看详细信息,请点击:[查看信息](https://jy.hxgk.group/StockTakingView?id=" + mainRecord.getId() + ")"); + markdown.put("content", content.toString()); + markDown.setMarkdown(markdown); String jsonString = JSONObject.toJSONString(markDown); jsonString = String.format(jsonString); System.out.println(jsonString); // 3.获取请求的url // 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url - String accessToken = "".equals(QyWxConfig.token)?QyWxConfig.GetQYWXToken():QyWxConfig.token; + String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token; String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken); // 4.调用接口,发送消息 @@ -308,13 +691,24 @@ public class QyWxOperationService { } + /** + * 将转移信息发送给盘点人员 + * @param map + * @return + */ + public JSONObject sendCcStockTakingTransferMessageToHead(Mapmap){ + + return null; + } + /** * 给仓库管理员发送出库通知 + * * @param uid * @param outMinId * @return */ - public JSONObject sendNotificationToDepositoryManager(String uid,Integer outMinId){ + public JSONObject sendNotificationToDepositoryManager(String uid, Integer outMinId) { // 需要出库的子订单 ApplicationOutRecordMin recordMin = depositoryRecordMapper.findApplicationOutMinById(outMinId); // 获取其主订单 @@ -345,15 +739,15 @@ public class QyWxOperationService { // 任务id,同一个应用任务id不能重复,只能由数字、字母和“_-@”组成,最长128字节 // 通过雪花算法获取taskId - Snowflake snowflake = new Snowflake(10,10,true); + Snowflake snowflake = new Snowflake(10, 10, true); text_notice.setTask_id(snowflake.nextIdStr()); textNotice.setMsgtype("template_card"); // 设置主标题 TemplateCard_main_title main_title = new TemplateCard_main_title(); - main_title.setTitle(applicant.getName()+"的出库请求"); - main_title.setDesc("申请时间:"+ DateUtil.TimeStampToDateTime(Long.valueOf(outRecordP.getApplicantTime()))); + main_title.setTitle(applicant.getName() + "的出库请求"); + main_title.setDesc("申请时间:" + DateUtil.TimeStampToDateTime(Long.valueOf(outRecordP.getApplicantTime()))); text_notice.setMain_title(main_title); // 卡片右上角更多操作按钮 @@ -374,15 +768,14 @@ public class QyWxOperationService { text_notice.setAction_menu(action_menu); - List horizontalContentList = new ArrayList<>(); - // 获取申请物料信息 + // 获取申请物料信息 Material materialById = materialMapper.findMaterialById(recordMin.getMid()); - // 获取仓库信息 - Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(recordMin.getDepositoryId()); - // 设至二级标题 - // 物料名称 + // 获取仓库信息 + Depository depositoryRecordById = depositoryMapper.findDepositoryById(recordMin.getDepositoryId()); + // 设至二级标题 + // 物料名称 TemplateCard_horizontal_content horizontal_content_mname = new TemplateCard_horizontal_content(); horizontal_content_mname.setType(0); horizontal_content_mname.setKeyname("物料名称:"); @@ -391,7 +784,7 @@ public class QyWxOperationService { TemplateCard_horizontal_content horizontal_content_mcode = new TemplateCard_horizontal_content(); horizontal_content_mcode.setType(0); horizontal_content_mcode.setKeyname("物料编码:"); - horizontal_content_mcode.setValue(materialById.getCode().toString()); + horizontal_content_mcode.setValue(materialById.getCode()); // 申请数量 TemplateCard_horizontal_content horizontal_content_quantity = new TemplateCard_horizontal_content(); horizontal_content_quantity.setType(0); @@ -420,7 +813,7 @@ public class QyWxOperationService { // 卡片整体点击事件 TemplateCard_card_action card_action = new TemplateCard_card_action(); card_action.setType(1); - card_action.setUrl("https://jy.hxgk.group/ApplicationOutMinByDidForMobile?depositoryId="+depositoryRecordById.getId()+"&state=0"); + card_action.setUrl("https://jy.hxgk.group/ApplicationOutMinByDidForMobile?depositoryId=" + depositoryRecordById.getId() + "&state=0"); text_notice.setCard_action(card_action); //跳转指引样式的列表 @@ -438,7 +831,7 @@ public class QyWxOperationService { // 3.获取请求的url // 获取access_token:根据企业id和应用密钥获取access_token,并拼接请求url - String accessToken = "".equals(QyWxConfig.token)?QyWxConfig.GetQYWXToken():QyWxConfig.token; + String accessToken = "".equals(QyWxConfig.token) ? QyWxConfig.GetQYWXToken() : QyWxConfig.token; String url = QyWxConfig.sendMessage_url.replace("ACCESS_TOKEN", accessToken); // 4.调用接口,发送消息 @@ -450,24 +843,26 @@ public class QyWxOperationService { // 返回 return jsonObject; } + /** * 用于撤回发送给企业微信的消息 + * * @param msgid 待撤回消息的id * @return */ - public String withdrawQyWxMessage(String msgid){ + public String withdrawQyWxMessage(String msgid) { String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/message/recall?access_token=%s", QyWxConfig.token); - Map param = new HashMap<>(); - param.put("msgid",msgid); + Map param = new HashMap<>(); + param.put("msgid", msgid); String jsonString = JSONObject.toJSONString(param); String post = HttpUtils.doPost(url, jsonString); JSONObject jsonObject = JSON.parseObject(post); String errmsg = jsonObject.getString("errmsg"); Integer errcode = jsonObject.getInteger("errcode"); - if(errcode == 0){ + if (errcode == 0) { // 如果撤回成功 return errmsg; - }else{ + } else { return errmsg; } } @@ -475,18 +870,19 @@ public class QyWxOperationService { /** * 用于更新卡片中的按钮为不可点击状态 + * * @param response_code * @return */ - public JSONObject updateTemplateCard(String response_code,String userName,String state){ - String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/message/update_template_card?access_token="+QyWxConfig.token+"&debug=1"); - Map map = new HashMap<>(); - map.put("atall",1); - map.put("agentid",QyWxConfig.AgentId); - map.put("response_code",response_code); - Map button = new HashMap<>(); - button.put("replace_name",userName+"已"+state); - map.put("button",button); + public JSONObject updateTemplateCard(String response_code, String userName, String state) { + String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/message/update_template_card?access_token=" + QyWxConfig.token + "&debug=1"); + Map map = new HashMap<>(); + map.put("atall", 1); + map.put("agentid", QyWxConfig.AgentId); + map.put("response_code", response_code); + Map button = new HashMap<>(); + button.put("replace_name", userName + "已" + state); + map.put("button", button); String jsonString = JSONObject.toJSONString(map); String s1 = HttpUtils.doPost(url, jsonString); JSONObject jsonObject = JSON.parseObject(s1); diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/StockTakingServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/StockTakingServiceImpl.java new file mode 100644 index 00000000..57ce13de --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/StockTakingServiceImpl.java @@ -0,0 +1,867 @@ +package com.dreamchaser.depository_manage.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.dreamchaser.depository_manage.config.PortConfig; +import com.dreamchaser.depository_manage.controller.PageController; +import com.dreamchaser.depository_manage.entity.*; +import com.dreamchaser.depository_manage.exception.MyException; +import com.dreamchaser.depository_manage.mapper.DepositoryMapper; +import com.dreamchaser.depository_manage.mapper.MaterialMapper; +import com.dreamchaser.depository_manage.mapper.PlaceMapper; +import com.dreamchaser.depository_manage.mapper.StockTakingMapper; +import com.dreamchaser.depository_manage.pojo.SimpleStockTakingP; +import com.dreamchaser.depository_manage.pojo.StockTakingChildP; +import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard; +import com.dreamchaser.depository_manage.service.DepositoryRecordService; +import com.dreamchaser.depository_manage.service.StockTakingService; +import com.dreamchaser.depository_manage.utils.DateUtil; +import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; +import com.dreamchaser.depository_manage.utils.WordUtil; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.servlet.http.HttpServletRequest; +import java.util.*; +import java.util.concurrent.TimeUnit; + +@Service +public class StockTakingServiceImpl implements StockTakingService { + + + @Autowired + StockTakingMapper stockTakingMapper; + + @Autowired + DepositoryMapper depositoryMapper; + + @Autowired + PlaceMapper placeMapper; + + @Autowired + RedissonClient redissonClient; + + @Autowired + RedisTemplate redisTemplate; + + @Autowired + MaterialMapper materialMapper; + + @Autowired + DepositoryRecordService depositoryRecordService; + + @Autowired + QyWxOperationService qyWxOperationService; + + /** + * 用于插入盘点记录主表 + * + * @param map + * @return + */ + @Transactional + @Override + public Integer insertStockTaking(Map map) { + // 设置盘点时间 + String simpleTime = DateUtil.getSimpleTime(new Date()); + map.put("createTime", DateUtil.DateTimeToTimeStamp(simpleTime)); + // 获取盘点位置 + String placeId = (String) map.get("placeId"); + Depository depository = null; + if ("0".equals(placeId)) { + // 如果是默认库位 + + // 获取仓库 + depository = depositoryMapper.findDepositoryById(ObjectFormatUtil.toInteger(map.get("depositoryId"))); + } else { + Place place = placeMapper.findPlaceById(ObjectFormatUtil.toInteger(placeId)); + depository = depositoryMapper.findDepositoryById(place.getDid()); + } + map.put("code", createTakingCode(depository.getDname())); + if (!map.containsKey("mainId")) { + stockTakingMapper.insertStockTaking(map); + Object id = map.get("id"); + map.remove("id"); + map.put("mainId", id); + } + return stockTakingMapper.insertStockTakingChild(map); + } + + /** + * 用于插入盘点记录主表 + * + * @param st + * @return + */ + @Transactional + @Override + public Integer insertStockTaking(StockTaking st) { + return null; + } + + + /** + * 根据条件查询自己的任务(根据isDone来决定查询已完成或者未完成的任务),同时支持分页查询(需要begin和size参数) + * + * @param map 查询参数 + * @return 我的任务 + */ + @Override + public List findMyTask(Map map, HttpServletRequest request) { + UserByPort userToken = (UserByPort) request.getAttribute("userToken"); + Integer size = 10, page = 1; + if (map.containsKey("size")) { + size = ObjectFormatUtil.toInteger(map.get("size")); + map.put("size", size); + } + if (map.containsKey("page")) { + page = ObjectFormatUtil.toInteger(map.get("page")); + map.put("begin", (page - 1) * size); + } + List myTask = stockTakingMapper.findMyTask(map); + List stockTakingPS = new ArrayList<>(); + for (int i = 0; i < myTask.size(); i++) { + StockTaking stockTaking = myTask.get(i); + SimpleStockTakingP ssp = new SimpleStockTakingP(stockTaking); + Depository depositoryRecordById = depositoryMapper.findDepositoryById(stockTaking.getDepositoryId()); + ssp.setDepositoryName(depositoryRecordById.getDname()); + UserByPort userByPort = PageController.FindUserById(stockTaking.getOriginator(), userToken); + ssp.setOriginatorName(userByPort.getName()); + stockTakingPS.add(ssp); + } + return stockTakingPS; + } + + /** + * 根据条件查询自己的任务数目 + * + * @param map + * @return + */ + @Override + public Integer findMyTaskCount(Map map) { + return stockTakingMapper.findMyTaskCount(map); + } + + + /** + * 根据条件查询自己的申请 + * @param map 查询参数 + * @return 我的任务 + */ + @Override + public List findMyApply(Map map, HttpServletRequest request) { + Integer size = 10, page = 1; + UserByPort userToken = (UserByPort) request.getAttribute("userToken"); + if (map.containsKey("size")) { + size = ObjectFormatUtil.toInteger(map.get("size")); + map.put("size", size); + } + if (map.containsKey("page")) { + page = ObjectFormatUtil.toInteger(map.get("page")); + map.put("begin", (page - 1) * size); + } + List myTask = stockTakingMapper.findMyTask(map); + List stockTakingPS = new ArrayList<>(); + for (int i = 0; i < myTask.size(); i++) { + StockTaking stockTaking = myTask.get(i); + SimpleStockTakingP ssp = new SimpleStockTakingP(stockTaking); + Depository depositoryRecordById = depositoryMapper.findDepositoryById(stockTaking.getDepositoryId()); + ssp.setDepositoryName(depositoryRecordById.getDname()); + UserByPort userByPort = PageController.FindUserById(stockTaking.getOriginator(), userToken); + ssp.setOriginatorName(userByPort.getName()); + stockTakingPS.add(ssp); + } + return stockTakingPS; + } + + /** + * 查询用户的申请数量 + * @param map + * @return + */ + @Override + public Integer findMyApplyCount(Map map) { + return stockTakingMapper.findMyApplyCount(map); + } + + /** + * 根据主键查询主表 + * + * @param id + * @return + */ + @Override + public StockTaking findStockTakingById(Integer id) { + return stockTakingMapper.selectStockTakingById(id); + } + + /** + * 根据主键查询主表 + * + * @param id + * @return + */ + @Override + public StockTaking findStockTakingById(Long id) { + return stockTakingMapper.selectStockTakingById(id); + } + + /** + * 根据主表获取所有子表 + * + * @param mainId + * @return + */ + @Override + public List findStockTakingChildPByMainId(Integer mainId) { + List stockTakingChildPS = stockTakingMapper.selectStockTakingChildByMainId(mainId); + for (int i = 0; i < stockTakingChildPS.size(); i++) { + StockTakingChildP stockTakingChildP = stockTakingChildPS.get(i); + if ("Inventory_up".equals(stockTakingChildP.getTakingResult())) { + stockTakingChildPS.get(i).setTakingResultShow("盘盈"); + } else if ("Inventory_down".equals(stockTakingChildP.getTakingResult())) { + stockTakingChildPS.get(i).setTakingResultShow("盘亏"); + } else { + stockTakingChildPS.get(i).setTakingResultShow("正常"); + } + } + return stockTakingChildPS; + } + + /** + * 根据主键获取子表 + * + * @param id + * @return + */ + @Override + public StockTakingChildP findStockTakingChildPById(Integer id) { + return stockTakingMapper.selectStockTakingChildPById(id); + } + + /** + * 用于对盘点进行审核 + * + * @param map + * @param userToken + * @return + */ + @Transactional + @Override + public Map review(Map map, UserByPort userToken) { + + + Map result = new HashMap<>(); + + StringBuilder QyWxUid = new StringBuilder(); + Integer state = ObjectFormatUtil.toInteger(map.get("state")); + Object o = (map.get("mainId")); + Integer res = 0; + if (o == null) { + throw new MyException("缺少必要参数"); + } + String stockTakingResult = "驳回"; + // 获取主表编号 + Integer mainId = ObjectFormatUtil.toInteger(o); + // 获取主单 + StockTaking mainRecord = stockTakingMapper.selectStockTakingById(mainId); + + // 获取负责人 + String departmentManager = mainRecord.getDepartmentManager(); + String[] split = departmentManager.split(","); + for (int i = 0; i < split.length; i++) { + String s = split[i]; + if("".equals(s)){ + continue; + } + UserByPort userByPort = PageController.FindUserById(ObjectFormatUtil.toInteger(s), userToken); + QyWxUid.append(userByPort.getWorkwechat()).append(","); + } + if (Integer.compare(state, 1) == 0) { + // 如果审核通过 + stockTakingResult = "通过"; + + // 定义错误信息 + Map errMsg = new HashMap<>(); + // 定义出错单号 + List errIds = new ArrayList<>(); + // 定义出错信息 + List err = new ArrayList<>(); + + Integer placeId = mainRecord.getPlaceId(); + // 获取库位详情 + Place placeById = placeMapper.findPlaceById(placeId); + Integer depositoryId = mainRecord.getDepositoryId(); + // 获取仓库详情 + Depository depositoryById = depositoryMapper.findDepositoryById(depositoryId); + + // 获取所有子单 + List minRecordList = stockTakingMapper.selectStockTakingChildByMainId(mainId); + for (int i = 0; i < minRecordList.size(); i++) { + // 获取子单详情 + StockTakingChildP minRecord = minRecordList.get(i); + // 获取盘点的物料详情 + + // 获取当前盘点结果 + String takingResult = minRecord.getTakingResult(); + if ("Inventory_normal".equals(takingResult)) { + // 如果盘点结果正常 + continue; + } + + // 获取盈亏数量 + Integer inventory = minRecord.getInventory(); + + + Material materialById = materialMapper.findMaterialById(minRecord.getMid()); + + Map paramForMaterialAndPlace = new HashMap<>(); + paramForMaterialAndPlace.put("mid", materialById.getId()); + paramForMaterialAndPlace.put("pid", placeById.getId()); + // 获取物料与库位的对应关系 + MaterialAndPlace placeAndMaterialByMidAndPid = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace); + + // 根据盘点结果重新计算物料的单价 + + // 数据库中的总额 + Double amounts = (materialById.getAmounts() / 100); + + Integer newInventory = minRecord.getNewInventory(); + Double avgPrice = 0.0; + if (Integer.compare(newInventory, 0) != 0) { + // 如果新的库存不是0 + + // 新的均价 + avgPrice = (amounts / newInventory) * 100; + } + + + materialById.setPrice(avgPrice); + + // 获取当前库位上物料数量 + Integer oldQuantity = materialById.getQuantity() - placeAndMaterialByMidAndPid.getQuantity(); + + materialById.setQuantity(oldQuantity + newInventory); + + + + // 用于计算新的库位数量 + Integer newNumberForPlace = 0; + // 用于计算新的库位与物料对应关系的数量 + Integer newNumberForMatrialAndPlace = 0; + if ("Inventory_up".equals(takingResult)) { + // 如果盘盈 + + // 更新当前库位数量 + newNumberForPlace = placeById.getQuantity() + inventory; + + if (newNumberForPlace < placeById.getMax()) { + + // 如果更新后的库位数量没有上溢 + + // 更新当前库位的数量 + placeById.setQuantity(newNumberForPlace); + } else { + // 添加错误信息 + errIds.add(minRecord.getId()); + err.add("当前库位数量溢出,需要转移"); + + continue; + } + + newNumberForMatrialAndPlace = placeAndMaterialByMidAndPid.getQuantity() + inventory; + // 更新物料与库位对应关系的数量 + placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace); + + } else { + + // 如果盘亏 + newNumberForPlace = placeById.getQuantity() - inventory; + + if (newNumberForPlace > placeById.getMin()) { + //如果更新后的库位数量没有下溢 + + // 更新当前库位数量 + placeById.setQuantity(newNumberForPlace); + + // 更新物料与库位对应关系的数量 + newNumberForMatrialAndPlace = placeAndMaterialByMidAndPid.getQuantity() - inventory; + + } else { + placeById.setQuantity(0); + newNumberForMatrialAndPlace = 0; + } + + + placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace); + + } + + + // 更新库位 + placeMapper.UpdatePlace(placeById); + + + // 更新库位与物料的对应关系 + placeMapper.updateMaterialAndPlace(placeAndMaterialByMidAndPid); + + + // 更新当前物料信息 + materialMapper.updateMaterial(materialById); + + } + + if (errIds.size() > 0) { + // 如果有出错的情况 + + errMsg.put("errIds", errIds); + errMsg.put("errMsg", err); + + result.put("errMsg", errMsg); + } + + } + + + // 更新结果 + map.put("id", mainId); + String simpleTime = DateUtil.getSimpleTime(new Date()); + map.put("completeTime", DateUtil.DateTimeToTimeStamp(simpleTime)); + map.put("departmentManager",userToken.getId()); + stockTakingMapper.updateStockTaking(map); + + // 更新 + String finalStockTakingResult = stockTakingResult; + new Thread(new Runnable() { + @Override + public void run() { + // 获取responseCode(key为申请人number) + //获取申请人信息 + String key = "user:"+userToken.getNumber()+":QyWxStockTakingId:"+mainId; + String responseCode = (String) redisTemplate.opsForHash().get(key, "responseCode"); + qyWxOperationService.updateTemplateCard(responseCode,userToken.getName(), finalStockTakingResult); + } + }).start(); + + return result; + } + + /** + * 用于进行盘点结果转移 + * @param map + * @return + */ + @Transactional + @Override + public Integer stockTakingTransfer(Map map,UserByPort userToken) { + List minIds = (List) map.get("minIds"); + + Integer res = 0; + + // 获取对应主订单 + StockTaking mainRecord = null; + for (int i = 0; i < minIds.size(); i++) { + + Integer minId = minIds.get(i); + // 获取对应子订单 + StockTakingChildP minRecord = stockTakingMapper.selectStockTakingChildPById(minId); + + // 获取当前物料 + Material material = materialMapper.findMaterialById(minRecord.getMid()); + + // 获取对应主订单 + mainRecord = stockTakingMapper.selectStockTakingById(minRecord.getMainId()); + + // 获取转移数量 + Integer inventory = ObjectFormatUtil.toInteger(map.get("inventory")); + // 获取转移前的库位 + Integer oldPlaceId = ObjectFormatUtil.toInteger(mainRecord.getPlaceId()); + Place oldPlace = placeMapper.findPlaceById(oldPlaceId); + + + // 获取转移后的数量 + Integer newInventory = minRecord.getNewInventory() - inventory; + // 获取转移到的库位 + Integer newPlaceId = ObjectFormatUtil.toInteger(map.get("placeId")); + Place newPlace = placeMapper.findPlaceById(newPlaceId); + + + if(Integer.compare(newPlace.getDid(),oldPlace.getDid()) != 0){ + // 转移前后不在同一仓库 + + material.setQuantity(newInventory); + + // 进行物料转移 + + Map paramForMaterialToDepository = new HashMap<>(); + paramForMaterialToDepository.put("depositoryId",newPlace.getDid()); + paramForMaterialToDepository.put("code",material.getCode()); + + // 获取转移后的仓库中的该物料 + List materialByDepository = materialMapper.findInventory(paramForMaterialToDepository); + if(materialByDepository.size() > 0){ + // 如果转移后的仓库中存在该物料 + Material transferMaterial = materialByDepository.get(0); + + //获取物料与转移后库位的对应关系 + Map paramForMaterialAndPlace = new HashMap<>(); + paramForMaterialAndPlace.put("mid",transferMaterial.getId()); + paramForMaterialAndPlace.put("pid",newPlace.getId()); + MaterialAndPlace newPlaceAndMaterial = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace); + if(newPlaceAndMaterial == null){ + // 如果转移之后没有该物料 + paramForMaterialAndPlace.put("quantity",inventory); + placeMapper.addMaterialOnPlace(paramForMaterialAndPlace); + }else{ + // 如果转移之后有该物料 + newPlaceAndMaterial.setQuantity(newPlaceAndMaterial.getQuantity() + inventory); + placeMapper.updateMaterialAndPlace(newPlaceAndMaterial); + } + } + else{ + // 如果不存在 + Material mt = new Material(); + + + mt.setQuantity(inventory); + mt.setDepositoryId(newPlace.getDid()); + mt.setAmounts(inventory * material.getPrice()); + mt.setPrice(material.getPrice()); + mt.setMaterialTypeId(material.getMaterialTypeId()); + mt.setTexture(material.getTexture()); + mt.setUnit(material.getUnit()); + mt.setVersion(material.getVersion()); + mt.setMname(material.getMname()); + mt.setCode(material.getCode()); + mt.setState(material.getState()); + + materialMapper.insertMaterial(mt); + + // 添加当前物料与库位之间的映射 + Map paramForMaterialAndPlace = new HashMap<>(); + paramForMaterialAndPlace.put("mid",mt.getId()); + paramForMaterialAndPlace.put("pid",newPlace.getId()); + paramForMaterialAndPlace.put("quantity",newInventory); + placeMapper.addMaterialOnPlace(paramForMaterialAndPlace); + + } + + //获取物料与转移前库位的对应关系 + Map paramForMaterialAndPlace = new HashMap<>(); + paramForMaterialAndPlace.put("mid",material.getId()); + paramForMaterialAndPlace.put("pid",oldPlace.getId()); + MaterialAndPlace oldPlaceAndMaterial = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace); + if(oldPlaceAndMaterial == null){ + // 如果转移之前没有该物料 + paramForMaterialAndPlace.put("quantity",newInventory); + placeMapper.addMaterialOnPlace(paramForMaterialAndPlace); + } + else{ + // 如果转移之前有该物料 + oldPlaceAndMaterial.setQuantity(oldPlaceAndMaterial.getQuantity() + newInventory); + placeMapper.updateMaterialAndPlace(oldPlaceAndMaterial); + } + + + } + else{ + // 如果在同一仓库 + + // 更新物料容量 + material.setQuantity(minRecord.getNewInventory()); + + //获取物料与转移前库位的对应关系 + Map paramForMaterialAndPlace = new HashMap<>(); + paramForMaterialAndPlace.put("mid",material.getId()); + paramForMaterialAndPlace.put("pid",oldPlace.getId()); + MaterialAndPlace oldPlaceAndMaterial = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace); + if(oldPlaceAndMaterial == null){ + // 如果转移之前没有该物料 + paramForMaterialAndPlace.put("quantity",newInventory); + placeMapper.addMaterialOnPlace(paramForMaterialAndPlace); + }else{ + // 如果转移之前有该物料 + oldPlaceAndMaterial.setQuantity(oldPlaceAndMaterial.getQuantity() + newInventory); + placeMapper.updateMaterialAndPlace(oldPlaceAndMaterial); + } + + // 获取物料与转移后库位的对应关系 + paramForMaterialAndPlace.put("pid",newPlace.getId()); + MaterialAndPlace newPlaceAndMaterial = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace); + if(newPlaceAndMaterial == null){ + // 如果转移后没有该物料 + paramForMaterialAndPlace.put("quantity",inventory); + placeMapper.addMaterialOnPlace(paramForMaterialAndPlace); + }else{ + // 如果转移后有该物料 + newPlaceAndMaterial.setQuantity(newPlaceAndMaterial.getQuantity() + inventory); + placeMapper.updateMaterialAndPlace(newPlaceAndMaterial); + } + + } + + + // 更新要转移的物料数据 + + res += materialMapper.updateMaterial(material); + + // 更新转移前库位数量 + oldPlace.setQuantity(oldPlace.getQuantity() + newInventory); + placeMapper.UpdatePlace(oldPlace); + // 更新转移后库位数量 + newPlace.setQuantity(newPlace.getQuantity() + inventory); + placeMapper.UpdatePlace(newPlace); + } + + // 开启一个线程用于发送抄送信息给盘点人员 + StockTaking finalMainRecord = mainRecord; + new Thread(new Runnable() { + @Override + public void run() { + Integer originator = finalMainRecord.getOriginator(); + StringBuilder departMentHeadQyWxName = new StringBuilder(); + UserByPort userByPort = PageController.FindUserById(ObjectFormatUtil.toInteger(originator), userToken); +// departMentHeadQyWxName.append(userByPort.getWorkwechat()+","); + departMentHeadQyWxName.append("PangFuZhen,"); + JSONObject jsonObject = qyWxOperationService.sendCcStockTakingMessageToHead(departMentHeadQyWxName.toString(), map, userToken, finalMainRecord); + } + }).start(); + + /* // 开启一个线程用于发送抄送信息给盘点人员 + StockTaking finalMainRecord = mainRecord; + new Thread(new Runnable() { + @Override + public void run() { + String departmentManager = finalMainRecord.getDepartmentManager(); + String[] strings = departmentManager.split(","); + StringBuilder departMentHeadQyWxName = new StringBuilder(); + for (int j = 0; j < strings.length; j++) { + String s = strings[j]; + if("".equals(s)){ + continue; + } + UserByPort userByPort = PageController.FindUserById(ObjectFormatUtil.toInteger(s), userToken); + departMentHeadQyWxName.append(userByPort.getWorkwechat()+","); + } + JSONObject jsonObject = qyWxOperationService.sendCcStockTakingMessageToHead(departMentHeadQyWxName.toString(), map, userToken, finalMainRecord); + } + }).start();*/ + + + + return res; + } + + /** + * 用于企业微信的审核申请处理 + * @param templateCard + * @return + */ + @Transactional + @Override + public Integer reviewByQyWx(TemplateCard templateCard) { + + + Map result = new HashMap<>(); + + + // 获取点击的按钮 + String clickKey = templateCard.getEventKey().split("_")[1]; + + // 点击用户 + String fromUserName = templateCard.getFromUserName(); + // 根据userId获取处理人 + Map portInfo = PortConfig.findUserByQyWxUserId(fromUserName); + UserByPort userByPort = (UserByPort) portInfo.get("user"); + + // 用于最终更新 + Map map = new HashMap<>(); + + // 获取主表编号 + String o = templateCard.getEventKey().split("wms_pass_StockTakingId")[1]; + Integer mainId = ObjectFormatUtil.toInteger(o); + + // 获取主单 + StockTaking mainRecord = stockTakingMapper.selectStockTakingById(mainId); + Integer state = 2; + if ("pass".equals(clickKey)) { + // 如果审核通过 + + state = 1; + // 定义错误信息 + Map errMsg = new HashMap<>(); + // 定义出错单号 + List errIds = new ArrayList<>(); + // 定义出错信息 + List err = new ArrayList<>(); + + Integer placeId = mainRecord.getPlaceId(); + // 获取库位详情 + Place placeById = placeMapper.findPlaceById(placeId); + Integer depositoryId = mainRecord.getDepositoryId(); + // 获取仓库详情 + Depository depositoryById = depositoryMapper.findDepositoryById(depositoryId); + + // 获取所有子单 + List minRecordList = stockTakingMapper.selectStockTakingChildByMainId(mainId); + for (int i = 0; i < minRecordList.size(); i++) { + // 获取子单详情 + StockTakingChildP minRecord = minRecordList.get(i); + // 获取盘点的物料详情 + + // 获取当前盘点结果 + String takingResult = minRecord.getTakingResult(); + if ("Inventory_normal".equals(takingResult)) { + // 如果盘点结果正常 + continue; + } + + // 获取盈亏数量 + Integer inventory = minRecord.getInventory(); + + + Material materialById = materialMapper.findMaterialById(minRecord.getMid()); + + Map paramForMaterialAndPlace = new HashMap<>(); + paramForMaterialAndPlace.put("mid", materialById.getId()); + paramForMaterialAndPlace.put("pid", placeById.getId()); + // 获取物料与库位的对应关系 + MaterialAndPlace placeAndMaterialByMidAndPid = placeMapper.findPlaceAndMaterialByMidAndPid(paramForMaterialAndPlace); + + // 根据盘点结果重新计算物料的单价 + + // 数据库中的总额 + Double amounts = (materialById.getAmounts() / 100); + + Integer newInventory = minRecord.getNewInventory(); + Double avgPrice = 0.0; + if (Integer.compare(newInventory, 0) != 0) { + // 如果新的库存不是0 + + // 新的均价 + avgPrice = (amounts / newInventory) * 100; + } + + + materialById.setPrice(avgPrice); + + // 获取当前库位上物料数量 + Integer oldQuantity = materialById.getQuantity() - placeAndMaterialByMidAndPid.getQuantity(); + + materialById.setQuantity(oldQuantity + newInventory); + + + + // 用于计算新的库位数量 + Integer newNumberForPlace = 0; + // 用于计算新的库位与物料对应关系的数量 + Integer newNumberForMatrialAndPlace = 0; + if ("Inventory_up".equals(takingResult)) { + // 如果盘盈 + + // 更新当前库位数量 + newNumberForPlace = placeById.getQuantity() + inventory; + + if (newNumberForPlace < placeById.getMax()) { + + // 如果更新后的库位数量没有上溢 + + // 更新当前库位的数量 + placeById.setQuantity(newNumberForPlace); + } else { + // 添加错误信息 + errIds.add(minRecord.getId()); + err.add("当前库位数量溢出,需要转移"); + + continue; + } + + newNumberForMatrialAndPlace = placeAndMaterialByMidAndPid.getQuantity() + inventory; + // 更新物料与库位对应关系的数量 + placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace); + + } else { + + // 如果盘亏 + newNumberForPlace = placeById.getQuantity() - inventory; + + if (newNumberForPlace > placeById.getMin()) { + //如果更新后的库位数量没有下溢 + + // 更新当前库位数量 + placeById.setQuantity(newNumberForPlace); + + // 更新物料与库位对应关系的数量 + newNumberForMatrialAndPlace = placeAndMaterialByMidAndPid.getQuantity() - inventory; + + } else { + placeById.setQuantity(0); + newNumberForMatrialAndPlace = 0; + } + + + placeAndMaterialByMidAndPid.setQuantity(newNumberForMatrialAndPlace); + + } + + + // 更新库位 + placeMapper.UpdatePlace(placeById); + + + // 更新库位与物料的对应关系 + placeMapper.updateMaterialAndPlace(placeAndMaterialByMidAndPid); + + + // 更新当前物料信息 + materialMapper.updateMaterial(materialById); + + } + + if (errIds.size() > 0) { + // 如果有出错的情况 + + errMsg.put("errIds", errIds); + errMsg.put("errMsg", err); + + result.put("errMsg", errMsg); + } + + } + // 更新结果 + + map.put("id", mainId); + map.put("state",state); + String simpleTime = DateUtil.getSimpleTime(new Date()); + map.put("completeTime", DateUtil.DateTimeToTimeStamp(simpleTime)); + map.put("departmentManager",userByPort.getId()); + stockTakingMapper.updateStockTaking(map); + return 1; + } + + + public String createTakingCode(String depositoryName) { + String key = "wms_stockTakingNumber"; + RLock lock = redissonClient.getLock(key); + String first = "GK"; + // 获取仓库的首字母 + depositoryName = WordUtil.getPinYinHeadChar(depositoryName); + String nowTime = DateUtil.getNowTime(); + lock.lock(5, TimeUnit.SECONDS); + String orderNumber = redisTemplate.opsForValue().get(key); + if (orderNumber == null) { + redisTemplate.opsForValue().set(key, "1", DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS); + orderNumber = "1"; + } + int newNumber = ObjectFormatUtil.toInteger(orderNumber) + 1; + redisTemplate.boundValueOps(key).set(String.valueOf(newNumber), DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS); + lock.unlock(); + orderNumber = String.format("%09d", ObjectFormatUtil.toInteger(orderNumber)); + String code = first + depositoryName + nowTime + orderNumber; + return code; + } +} diff --git a/src/main/resources/templates/pages/application/application-in.html b/src/main/resources/templates/pages/application/application-in.html index a7ef46cb..20bd1f1a 100644 --- a/src/main/resources/templates/pages/application/application-in.html +++ b/src/main/resources/templates/pages/application/application-in.html @@ -207,10 +207,9 @@ let scanValue = {}; // 用于卡片编号 var NewIdNumber = 1; - layui.use(['form', 'miniTab', 'step', 'flow'], function () { + layui.use(['form', 'step', 'flow'], function () { var $ = layui.$, form = layui.form, - miniTab = layui.miniTab, step = layui.step; // 用于分步表单加载 diff --git a/src/main/resources/templates/pages/application/my-apply.html b/src/main/resources/templates/pages/application/my-apply.html index e8d2acc9..6e9b96ee 100644 --- a/src/main/resources/templates/pages/application/my-apply.html +++ b/src/main/resources/templates/pages/application/my-apply.html @@ -43,6 +43,9 @@ }; function openDetailOut(data) { + }; + function openDetailTaking(data){ + }; layui.use(['flow', 'layer', 'flow', 'util'], function () { var $ = layui.jquery, @@ -51,6 +54,7 @@ util = layui.util; let size = 8; let inpre = 0; + let takingPre = 0; let outpre = 0; flow.load({ elem: '#LAY_floor_in' //流加载容器 @@ -81,6 +85,29 @@ //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 next(lis.join(''), inpre < InCount); }); + let lis1 = []; + $.get('/stockTaking/myApply?page=' + page + '&size=' + size, function (res) { + result = res.data; + var Width = "25%"; + if (isMobile()) { + Width = "50%"; + } + for (let i=0;i

' + +result[i].originatorName+'的'); + lis1.push('盘点记录

'); + lis1.push('
' + +result[i].createTime+'
'); + } + lis1.push(''); + lis1.push('
') + takingPre+=result.length; + //执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页 + //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 + next(lis1.join(''), takingPre < res.count); + }); + } }); flow.load({ @@ -145,6 +172,23 @@ layer.full(index); }); }; + openDetailTaking = function (data) { + var index = layer.open({ + title: '请求详情', + type: 2, + shade: 0.2, + maxmin: true, + shadeClose: true, + area: ['100%', '100%'], + content: '/StockTakingView?id='+data, + end:function () { + location.reload() + } + }); + $(window).on("resize", function () { + layer.full(index); + }); + }; //定义一个函数判断是手机端还是pc端 function isMobile() { diff --git a/src/main/resources/templates/pages/application/my-task.html b/src/main/resources/templates/pages/application/my-task.html index 485f7bb6..474ab2aa 100644 --- a/src/main/resources/templates/pages/application/my-task.html +++ b/src/main/resources/templates/pages/application/my-task.html @@ -78,6 +78,15 @@ // 用于手机端跳转 function openDetail4_mobile(data) { }; + + //先声明(用于pc端跳转) + function openDetailForTaking(data){ + + } + + function openDetailTaking(data){ + + } layui.use(['flow', 'layer', 'table', 'util'], function () { var $ = layui.jquery, layer = layui.layer, @@ -86,22 +95,23 @@ util = layui.util; //每页的数量 var size=8; - let pre1=0,pre2=0; + let pre1=0,pre2=0,pre3 = 0,pre4 = 0; flow.load({ elem: '#LAY_floor1' //流加载容器 ,scrollElem: '#LAY_floor1' //滚动条所在元素,一般不用填,此处只是演示需要。 ,isAuto:false ,done: function(page, next){ //执行下一页的回调 let lis = []; + let lis1 = []; let result; $.get('/depositoryRecord/myTask?page='+page+'&size='+size+'&isDone=0', function(res){ var Width = "25%"; result=res.data; - lis.push("
") + lis.push("
"); + if(isMobile()){ + Width = "50%"; + } for (let i=0;i

' +result[i].applicantName+'的'); @@ -110,11 +120,35 @@ +result[i].applicantTime+'

'); } lis.push('
'); + lis.push('
') pre1+=result.length; //执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页 //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 next(lis.join(''), pre1 < res.count); }); + $.get('/stockTaking/myTask?page='+page+'&size='+size+'&isDone=0', function(res){ + var Width = "25%"; + result=res.data; + lis1.push("
"); + if(isMobile()){ + Width = "50%"; + } + for (let i=0;i

' + +result[i].originatorName+'的'); + lis1.push('盘点记录

'); + lis1.push('
' + +result[i].createTime+'
'); + } + lis1.push('
'); + lis1.push('
') + pre3+=result.length; + //执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页 + //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 + next(lis1.join(''), pre3 < res.count); + }); + } }); flow.load({ @@ -123,6 +157,7 @@ ,isAuto:false ,done: function(page, next){ //执行下一页的回调 let lis = []; + let lis1 = []; let result; $.get('/depositoryRecord/myTask?page='+page+'&size='+size+'&isDone=1', function(res){ var Width = "25%"; @@ -143,12 +178,35 @@ lis.push('
' +result[i].applicantTime+'
'); } - lis.push("") + lis.push(""); + lis.push('
'); pre2+=result.length; //执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页 //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 next(lis.join(''), pre2 < res.count); }); + $.get('/stockTaking/myTask?page='+page+'&size='+size+'&isDone=1', function(res){ + var Width = "25%"; + result=res.data; + lis1.push("
"); + if(isMobile()){ + Width = "50%"; + } + for (let i=0;i

' + +result[i].originatorName+'的'); + lis1.push('盘点记录

'); + lis1.push('
' + +result[i].createTime+'
'); + } + lis1.push('
'); + lis1.push('
') + pre4+=result.length; + //执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页 + //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 + next(lis1.join(''), pre4 < res.count); + }); } }); flow.load({ @@ -181,7 +239,8 @@ +result[keys[i]][0].applicantTime+''); } - lis.push("") + lis.push(""); + lis.push('
'); pre2+=result.length; //执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页 //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 @@ -221,6 +280,7 @@ } lis.push("") + lis.push('
'); pre2+=result.length; //执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页 //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 @@ -337,6 +397,42 @@ }); }; + openDetailForTaking = function (data) { + var index = layer.open({ + title: '请求详情', + type: 2, + shade: 0.2, + maxmin: true, + shadeClose: true, + area: ['100%', '100%'], + content: '/StockTakingReview?id='+data, + end:function () { + location.reload() + } + }); + $(window).on("resize", function () { + layer.full(index); + }); + }; + + openDetailTaking = function (data) { + var index = layer.open({ + title: '请求详情', + type: 2, + shade: 0.2, + maxmin: true, + shadeClose: true, + area: ['100%', '100%'], + content: '/StockTakingView?id='+data, + end:function () { + location.reload() + } + }); + $(window).on("resize", function () { + layer.full(index); + }); + }; + //定义一个函数判断是手机端还是pc端 function isMobile(){ if(window.navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)) { diff --git a/src/main/resources/templates/pages/material/material-view.html b/src/main/resources/templates/pages/material/material-view.html index 6e041d31..187bb0f7 100644 --- a/src/main/resources/templates/pages/material/material-view.html +++ b/src/main/resources/templates/pages/material/material-view.html @@ -70,7 +70,7 @@ - diff --git a/src/main/resources/templates/pages/material/selectMaterialByCardForTaking.html b/src/main/resources/templates/pages/material/selectMaterialByCardForTaking.html index 980f4b8c..4abd2b7c 100644 --- a/src/main/resources/templates/pages/material/selectMaterialByCardForTaking.html +++ b/src/main/resources/templates/pages/material/selectMaterialByCardForTaking.html @@ -40,7 +40,6 @@ return false } var windowParent = $("#"+clickObj,window.parent.document)[0]; - console.log(windowParent) var children = windowParent.childNodes[5]; var materialItem = children.childNodes[3].childNodes[1].childNodes; var materialName = materialItem[1]; diff --git a/src/main/resources/templates/pages/stockTaking/stockTakingReview.html b/src/main/resources/templates/pages/stockTaking/stockTakingReview.html new file mode 100644 index 00000000..b951d090 --- /dev/null +++ b/src/main/resources/templates/pages/stockTaking/stockTakingReview.html @@ -0,0 +1,350 @@ + + + + + 仓库盘点 + + + + + + + + + +
+
+ +
+
+ + + + + \ No newline at end of file diff --git a/src/main/resources/templates/pages/stockTaking/stockTakingView.html b/src/main/resources/templates/pages/stockTaking/stockTakingView.html new file mode 100644 index 00000000..cea6c1b5 --- /dev/null +++ b/src/main/resources/templates/pages/stockTaking/stockTakingView.html @@ -0,0 +1,291 @@ + + + + + 仓库盘点 + + + + + + + + + +
+
+ +
+
+ + + + + \ No newline at end of file diff --git a/src/main/resources/templates/pages/stockTaking/stockTransfer.html b/src/main/resources/templates/pages/stockTaking/stockTransfer.html new file mode 100644 index 00000000..2f3243b9 --- /dev/null +++ b/src/main/resources/templates/pages/stockTaking/stockTransfer.html @@ -0,0 +1,395 @@ + + + + + 仓库盘点 + + + + + + + + + +
+
+
+
+ 转移盘点 +
+
+
+
+
+ +
+ + + + + +
+
+
+ +
+ 转移明细 +
+
+ +
+
+

+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/src/test/java/com/dreamchaser/depository_manage/Test.java b/src/test/java/com/dreamchaser/depository_manage/Test.java index cae3551f..2783500e 100644 --- a/src/test/java/com/dreamchaser/depository_manage/Test.java +++ b/src/test/java/com/dreamchaser/depository_manage/Test.java @@ -13,16 +13,14 @@ import com.dreamchaser.depository_manage.entity.*; import com.dreamchaser.depository_manage.mapper.MaterialMapper; import com.dreamchaser.depository_manage.mapper.MaterialTypeMapper; import com.dreamchaser.depository_manage.pojo.MaterialP; +import com.dreamchaser.depository_manage.pojo.StockTakingChildP; import com.dreamchaser.depository_manage.pojo.UserByPortP; import com.dreamchaser.depository_manage.pojo.callBackXml.CallBackBaseXml; import com.dreamchaser.depository_manage.pojo.callBackXml.CallBackXml_button; import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard; import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard_SelectedItems; import com.dreamchaser.depository_manage.pojo.callBackXml.callBackXml_button_templatecard.TemplateCard_button_selection; -import com.dreamchaser.depository_manage.service.DepositoryRecordService; -import com.dreamchaser.depository_manage.service.DepositoryService; -import com.dreamchaser.depository_manage.service.MaterialService; -import com.dreamchaser.depository_manage.service.MaterialTypeService; +import com.dreamchaser.depository_manage.service.*; import com.dreamchaser.depository_manage.service.impl.QyWxOperationService; import com.dreamchaser.depository_manage.utils.*; import lombok.extern.log4j.Log4j2; @@ -69,17 +67,20 @@ import org.xml.sax.InputSource; public class Test { - + @Autowired + QyWxOperationService qyWxOperationService; @org.junit.Test public void test1() throws AesException, IOException, ParserConfigurationException, SAXException { + } + } diff --git a/target/classes/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml b/target/classes/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml index 7fb56933..52718889 100644 --- a/target/classes/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml +++ b/target/classes/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml @@ -170,7 +170,7 @@ - SELECT FROM depository d WHERE d.id = #{id} diff --git a/target/classes/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml b/target/classes/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml index 48a8b558..03fcd375 100644 --- a/target/classes/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml +++ b/target/classes/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml @@ -11,7 +11,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -345,7 +345,7 @@ - + INSERT INTO material ( id, depository_id, mname, quantity, price, type_id,code,unit,version,texture,amounts,depositoryCode ) VALUES ( @@ -467,8 +467,8 @@ price = #{price}, - - type_id = #{typeId}, + + type_id = #{materialTypeId}, state = #{state}, diff --git a/target/classes/templates/pages/application/application-in.html b/target/classes/templates/pages/application/application-in.html index a7ef46cb..20bd1f1a 100644 --- a/target/classes/templates/pages/application/application-in.html +++ b/target/classes/templates/pages/application/application-in.html @@ -207,10 +207,9 @@ let scanValue = {}; // 用于卡片编号 var NewIdNumber = 1; - layui.use(['form', 'miniTab', 'step', 'flow'], function () { + layui.use(['form', 'step', 'flow'], function () { var $ = layui.$, form = layui.form, - miniTab = layui.miniTab, step = layui.step; // 用于分步表单加载 diff --git a/target/classes/templates/pages/application/my-apply.html b/target/classes/templates/pages/application/my-apply.html index e8d2acc9..6e9b96ee 100644 --- a/target/classes/templates/pages/application/my-apply.html +++ b/target/classes/templates/pages/application/my-apply.html @@ -43,6 +43,9 @@ }; function openDetailOut(data) { + }; + function openDetailTaking(data){ + }; layui.use(['flow', 'layer', 'flow', 'util'], function () { var $ = layui.jquery, @@ -51,6 +54,7 @@ util = layui.util; let size = 8; let inpre = 0; + let takingPre = 0; let outpre = 0; flow.load({ elem: '#LAY_floor_in' //流加载容器 @@ -81,6 +85,29 @@ //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 next(lis.join(''), inpre < InCount); }); + let lis1 = []; + $.get('/stockTaking/myApply?page=' + page + '&size=' + size, function (res) { + result = res.data; + var Width = "25%"; + if (isMobile()) { + Width = "50%"; + } + for (let i=0;i

' + +result[i].originatorName+'的'); + lis1.push('盘点记录

'); + lis1.push('
' + +result[i].createTime+'
'); + } + lis1.push(''); + lis1.push('
') + takingPre+=result.length; + //执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页 + //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 + next(lis1.join(''), takingPre < res.count); + }); + } }); flow.load({ @@ -145,6 +172,23 @@ layer.full(index); }); }; + openDetailTaking = function (data) { + var index = layer.open({ + title: '请求详情', + type: 2, + shade: 0.2, + maxmin: true, + shadeClose: true, + area: ['100%', '100%'], + content: '/StockTakingView?id='+data, + end:function () { + location.reload() + } + }); + $(window).on("resize", function () { + layer.full(index); + }); + }; //定义一个函数判断是手机端还是pc端 function isMobile() { diff --git a/target/classes/templates/pages/application/my-task.html b/target/classes/templates/pages/application/my-task.html index 485f7bb6..474ab2aa 100644 --- a/target/classes/templates/pages/application/my-task.html +++ b/target/classes/templates/pages/application/my-task.html @@ -78,6 +78,15 @@ // 用于手机端跳转 function openDetail4_mobile(data) { }; + + //先声明(用于pc端跳转) + function openDetailForTaking(data){ + + } + + function openDetailTaking(data){ + + } layui.use(['flow', 'layer', 'table', 'util'], function () { var $ = layui.jquery, layer = layui.layer, @@ -86,22 +95,23 @@ util = layui.util; //每页的数量 var size=8; - let pre1=0,pre2=0; + let pre1=0,pre2=0,pre3 = 0,pre4 = 0; flow.load({ elem: '#LAY_floor1' //流加载容器 ,scrollElem: '#LAY_floor1' //滚动条所在元素,一般不用填,此处只是演示需要。 ,isAuto:false ,done: function(page, next){ //执行下一页的回调 let lis = []; + let lis1 = []; let result; $.get('/depositoryRecord/myTask?page='+page+'&size='+size+'&isDone=0', function(res){ var Width = "25%"; result=res.data; - lis.push("
") + lis.push("
"); + if(isMobile()){ + Width = "50%"; + } for (let i=0;i

' +result[i].applicantName+'的'); @@ -110,11 +120,35 @@ +result[i].applicantTime+'

'); } lis.push('
'); + lis.push('
') pre1+=result.length; //执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页 //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 next(lis.join(''), pre1 < res.count); }); + $.get('/stockTaking/myTask?page='+page+'&size='+size+'&isDone=0', function(res){ + var Width = "25%"; + result=res.data; + lis1.push("
"); + if(isMobile()){ + Width = "50%"; + } + for (let i=0;i

' + +result[i].originatorName+'的'); + lis1.push('盘点记录

'); + lis1.push('
' + +result[i].createTime+'
'); + } + lis1.push('
'); + lis1.push('
') + pre3+=result.length; + //执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页 + //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 + next(lis1.join(''), pre3 < res.count); + }); + } }); flow.load({ @@ -123,6 +157,7 @@ ,isAuto:false ,done: function(page, next){ //执行下一页的回调 let lis = []; + let lis1 = []; let result; $.get('/depositoryRecord/myTask?page='+page+'&size='+size+'&isDone=1', function(res){ var Width = "25%"; @@ -143,12 +178,35 @@ lis.push('
' +result[i].applicantTime+'
'); } - lis.push("") + lis.push(""); + lis.push('
'); pre2+=result.length; //执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页 //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 next(lis.join(''), pre2 < res.count); }); + $.get('/stockTaking/myTask?page='+page+'&size='+size+'&isDone=1', function(res){ + var Width = "25%"; + result=res.data; + lis1.push("
"); + if(isMobile()){ + Width = "50%"; + } + for (let i=0;i

' + +result[i].originatorName+'的'); + lis1.push('盘点记录

'); + lis1.push('
' + +result[i].createTime+'
'); + } + lis1.push('
'); + lis1.push('
') + pre4+=result.length; + //执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页 + //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 + next(lis1.join(''), pre4 < res.count); + }); } }); flow.load({ @@ -181,7 +239,8 @@ +result[keys[i]][0].applicantTime+''); } - lis.push("") + lis.push(""); + lis.push('
'); pre2+=result.length; //执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页 //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 @@ -221,6 +280,7 @@ } lis.push("") + lis.push('
'); pre2+=result.length; //执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页 //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多 @@ -337,6 +397,42 @@ }); }; + openDetailForTaking = function (data) { + var index = layer.open({ + title: '请求详情', + type: 2, + shade: 0.2, + maxmin: true, + shadeClose: true, + area: ['100%', '100%'], + content: '/StockTakingReview?id='+data, + end:function () { + location.reload() + } + }); + $(window).on("resize", function () { + layer.full(index); + }); + }; + + openDetailTaking = function (data) { + var index = layer.open({ + title: '请求详情', + type: 2, + shade: 0.2, + maxmin: true, + shadeClose: true, + area: ['100%', '100%'], + content: '/StockTakingView?id='+data, + end:function () { + location.reload() + } + }); + $(window).on("resize", function () { + layer.full(index); + }); + }; + //定义一个函数判断是手机端还是pc端 function isMobile(){ if(window.navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)) { diff --git a/target/classes/templates/pages/material/material-view.html b/target/classes/templates/pages/material/material-view.html index 6e041d31..187bb0f7 100644 --- a/target/classes/templates/pages/material/material-view.html +++ b/target/classes/templates/pages/material/material-view.html @@ -70,7 +70,7 @@ -