From a17457cb23b083e7c8c575dfda2ab76e82c79ea8 Mon Sep 17 00:00:00 2001 From: siontion Date: Thu, 30 May 2024 16:12:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=A5=E5=B7=A5=E5=BC=82=E5=B8=B8=20?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E9=99=84=E4=BB=B6=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/chanjet/ChanjetController.java | 41 +- .../admin/chanjet/ChanjetInterfaceEnum.java | 6 +- .../UnqualifiedNotificationDO.java | 3 + .../UnqualifiedNotificationMapper.java | 2 + .../module/biz/manager/ChanjetSchedule.java | 1318 +++++++++++++++++ 5 files changed, 1359 insertions(+), 11 deletions(-) create mode 100644 mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/manager/ChanjetSchedule.java diff --git a/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/controller/admin/chanjet/ChanjetController.java b/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/controller/admin/chanjet/ChanjetController.java index 63e82cdf..7844149d 100644 --- a/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/controller/admin/chanjet/ChanjetController.java +++ b/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/controller/admin/chanjet/ChanjetController.java @@ -9,6 +9,7 @@ import com.chanko.yunxi.mes.module.biz.controller.admin.chanjet.vo.BomMaterialVO import com.chanko.yunxi.mes.module.biz.controller.admin.chanjet.vo.QueryCurrentStockResVO; import com.chanko.yunxi.mes.module.biz.controller.admin.procedure.vo.ProcedureSaveReqVO; import com.chanko.yunxi.mes.module.biz.manager.ChanjetManager; +import com.chanko.yunxi.mes.module.biz.manager.ChanjetSchedule; import com.chanko.yunxi.mes.module.system.controller.admin.user.vo.user.UserSaveReqVO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -44,6 +45,9 @@ public class ChanjetController { private ChanjetSpi chanjetSpi; @Resource private ChanjetManager chanjetManager; + + @Resource + private ChanjetSchedule chanjetSchedule; @Resource private ChanjetTokenHolder chanjetTokenHolder; @@ -214,13 +218,34 @@ public class ChanjetController { public void synchronizeData() throws ChanjetApiException{ - chanjetManager.queryDept(); - chanjetManager.queryWorkshop(); - chanjetManager.queryCustomer(); - chanjetManager.querySupplier(); - chanjetManager.queryMaterial(); - chanjetManager.queryProjectOrder(); - - chanjetManager.queryWarehouse(); + //查询部门 + chanjetSchedule.queryDept(); + //查询车间 + chanjetSchedule.queryWorkshop(); + //查询客户 + chanjetSchedule.queryCustomer(); + //查询供应商 + chanjetSchedule.querySupplier(); + //查询销售订单列表 + chanjetSchedule.queryProjectOrder(); + + //查询bom表 + chanjetSchedule.queryProcessBom(null,null); + //查询存货 + chanjetSchedule.queryMaterial(); + //查询库存-现存量 + chanjetSchedule.queryStock(null,null); + //查询仓库 + chanjetSchedule.queryWarehouse(); + + //创建入库 + chanjetSchedule.createStorageInOrder(new Long(0)); + //创建出库 + chanjetSchedule.createStockOutOrder(new Long(0)); + + //创建工序 + chanjetSchedule.createProcedure(null); + //创建员工 + chanjetSchedule.createUser(null); } } diff --git a/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/controller/admin/chanjet/ChanjetInterfaceEnum.java b/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/controller/admin/chanjet/ChanjetInterfaceEnum.java index 49338d29..ac308385 100644 --- a/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/controller/admin/chanjet/ChanjetInterfaceEnum.java +++ b/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/controller/admin/chanjet/ChanjetInterfaceEnum.java @@ -20,7 +20,7 @@ public enum ChanjetInterfaceEnum { CREATE_PROCEDURE("/tplus/api/v2/process/Create", "创建工序", CreateProcedureReqVO.class, Long.class), CREATE_EMPLOYEE("/tplus/api/v2/person/Create", "创建员工", CreateOrUpdateEmployeeReqVO.class, Long.class), UPDATE_EMPLOYEE("/tplus/api/v2/person/Update", "更新员工", CreateOrUpdateEmployeeReqVO.class, Boolean.class), - QUERY_INVENTORY("/tplus/api/v2/inventory/Query", "查询物料", QueryMaterialReqVO.class, QueryMaterialResVO.class), + QUERY_INVENTORY("/tplus/api/v2/inventory/Query", "查询物料(存货)", QueryMaterialReqVO.class, QueryMaterialResVO.class), QUERY_SALE_ORDER_LIST("/tplus/api/v2/SaleOrderOpenApi/FindVoucherList", "查询销售订单列表", QuerySaleOrderListReqVO.class, ListResultResVO.class), QUERY_SALE_ORDER("/tplus/api/v2/SaleOrderOpenApi/GetVoucherDTO", "查询销售订单", QuerySaleOrderReqVO.class, ResultResVO.class), CREATE_REPORT("/tplus/api/v2/ManufactureReportOpenApi/Create", "创建报工记录", CreateReportReqVO.class, ResultResVO.class), @@ -30,8 +30,8 @@ public enum ChanjetInterfaceEnum { CREATE_PRODUCTION_ORDER("/tplus/api/v2/ManufactureOrderOpenApi/Create", "创建生产加工单", CreateProductionOrderReqVO.class, ResultResVO.class), AUDIT_PRODUCTION_ORDER("/tplus/api/v2/ManufactureOrderOpenApi/Audit", "审核生产加工单", AuditProductionOrderReqVO.class, ResultResVO.class), QUERY_PRODUCTION_ORDER_LIST("/tplus/api/v2/ManufactureOrderOpenApi/FindVoucherList", "查询生产加工单", ListProductionOrderReqVO.class, ListResultResVO.class), - QUERY_BOM("/tplus/api/v2/bom/Query", "查询物料清单列表", QueryBomReqVO.class, QueryBomResVO.class), - QUERY_CURRENT_STOCK("/tplus/api/v2/currentStock/Query", "查询存货", QueryCurrentStockReqVO.class, QueryCurrentStockResVO.class), + QUERY_BOM("/tplus/api/v2/bom/Query", "查询bom列表", QueryBomReqVO.class, QueryBomResVO.class), + QUERY_CURRENT_STOCK("/tplus/api/v2/currentStock/Query", "查询库存", QueryCurrentStockReqVO.class, QueryCurrentStockResVO.class), QUERY_WAREHOUSE("/tplus/api/v2/warehouse/Query", "查询仓库", QueryWarehouseReqVO.class, QueryWarehouseResVO.class), ; diff --git a/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/dataobject/unqualifiednotification/UnqualifiedNotificationDO.java b/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/dataobject/unqualifiednotification/UnqualifiedNotificationDO.java index 1d391db6..2c4d27fc 100644 --- a/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/dataobject/unqualifiednotification/UnqualifiedNotificationDO.java +++ b/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/dataobject/unqualifiednotification/UnqualifiedNotificationDO.java @@ -145,6 +145,9 @@ public class UnqualifiedNotificationDO extends BaseDO { @TableField(exist = false) private String workshopName; + @TableField(exist = false) + private String fileUrl; + public boolean canSave(){ return UnqualifiedNotificationStatusEnum.SAVE.getCode() == this.notificationStatus.intValue(); } diff --git a/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/mysql/unqualifiednotification/UnqualifiedNotificationMapper.java b/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/mysql/unqualifiednotification/UnqualifiedNotificationMapper.java index a634e42f..9adfd34e 100644 --- a/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/mysql/unqualifiednotification/UnqualifiedNotificationMapper.java +++ b/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/mysql/unqualifiednotification/UnqualifiedNotificationMapper.java @@ -12,6 +12,7 @@ import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderD import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderSubDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.unqualifiednotification.UnqualifiedNotificationDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.workshop.WorkshopDO; +import com.chanko.yunxi.mes.module.infra.dal.dataobject.file.FileDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; @@ -34,6 +35,7 @@ public interface UnqualifiedNotificationMapper extends BaseMapperX> result = chanjetSpi.invokeRetList(QUERY_DEPARTMENT_OR_WORKSHOP, new QueryDepartmentReqVO(new QueryDepartmentDTO()), QueryDepartmentResVO.class); + if(!result.isSuccess()){ + throw exception(CALL_API_ERROR); + } + + if(CollUtil.isNotEmpty(result.getData())){ + // 过滤车间数据 + List deptDataList = result.getData().stream().filter(queryDepartmentResVO -> queryDepartmentResVO.getName().indexOf("车间") < 0).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(deptDataList)){ + + ArrayList insertList = new ArrayList<>(16); + ArrayList updateList = new ArrayList<>(16); + + Map> queryDeptGroupById = deptDataList.stream().collect(Collectors.groupingBy(QueryDepartmentResVO::getId)); + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(DeptDO::getId, queryDeptGroupById.keySet()); + List existsDOList = deptMapper.selectList(query); + Map> existsDOGroupById = existsDOList.stream().collect(Collectors.groupingBy(DeptDO::getId)); + + // 处理 + queryDeptGroupById.forEach((id, voList) -> { + QueryDepartmentResVO queryDept = voList.get(0); + QueryDepartmentResVO.ParentVO parent = queryDept.getParent(); + QueryDepartmentResVO.DirectorVO director = queryDept.getDirector(); + Long parentId = (parent != null && parent.getId() != null) ? parent.getId() : null; + Long leaderUserId = null; + if(director != null && !StringUtils.isEmpty(director.getCode())){ + AdminUserDO adminUserDO = adminUserService.getUserByUsername(director.getCode()); + leaderUserId = adminUserDO.getId(); + } + + List existsDOs = existsDOGroupById.get(id); + if(CollUtil.isNotEmpty(existsDOs)){ + DeptDO existsDO = existsDOs.get(0); + existsDO.setCode(queryDept.getCode()).setLeaderUserId(leaderUserId).setName(existsDO.getName()).setParentId(parentId).setStatus(SystemValidStatusEnum.VALID.getCode()); + updateList.add(existsDO); + }else{ + DeptDO deptDO = BeanUtils.toBean(queryDept, DeptDO.class); + deptDO.setParentId(parentId).setLeaderUserId(leaderUserId); + insertList.add(deptDO); + } + }); + + // 入库 + if(CollUtil.isNotEmpty(updateList)) deptMapper.updateBatch(updateList); + if(CollUtil.isNotEmpty(insertList)) deptMapper.insertBatch(insertList); + + // 禁用 + deptMapper.update(new LambdaUpdateWrapper(){{ + notIn(DeptDO::getId, queryDeptGroupById.keySet()).set(DeptDO::getStatus, SystemValidStatusEnum.INVALID.getCode()); + }}); + } + } + } + + /** + * 查询车间 + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public void queryWorkshop() throws ChanjetApiException { + // 设置为“否”,关闭所有与用友通信的接口 + if(!getSystemParameters()) return; + CommonResult> result = chanjetSpi.invokeRetList(QUERY_DEPARTMENT_OR_WORKSHOP, new QueryDepartmentReqVO(new QueryDepartmentDTO()), QueryDepartmentResVO.class); + if(!result.isSuccess()){ + throw exception(CALL_API_ERROR); + } + + if(CollUtil.isNotEmpty(result.getData())){ + // 仅保留车间数据 + List deptDataList = result.getData().stream().filter(queryDepartmentResVO -> queryDepartmentResVO.getName().indexOf("车间") > -1).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(deptDataList)){ + + ArrayList insertList = new ArrayList<>(16); + ArrayList updateList = new ArrayList<>(16); + + Map> queryDeptGroupById = deptDataList.stream().collect(Collectors.groupingBy(QueryDepartmentResVO::getId)); + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(WorkshopDO::getId, queryDeptGroupById.keySet()); + List existsDOList = workshopMapper.selectList(query); + Map> existsDOGroupById = existsDOList.stream().collect(Collectors.groupingBy(WorkshopDO::getId)); + + // 处理 + queryDeptGroupById.forEach((id, voList) -> { + QueryDepartmentResVO queryDept = voList.get(0); + QueryDepartmentResVO.ParentVO parent = queryDept.getParent(); + QueryDepartmentResVO.DirectorVO director = queryDept.getDirector(); + Long parentId = (parent != null && parent.getId() != null) ? parent.getId() : null; + Long leaderUserId = null; + if(director != null && !StringUtils.isEmpty(director.getCode())){ + AdminUserDO adminUserDO = adminUserService.getUserByUsername(director.getCode()); + leaderUserId = adminUserDO.getId(); + } + + List existsDOs = existsDOGroupById.get(id); + if(CollUtil.isNotEmpty(existsDOs)){ + WorkshopDO existsDO = existsDOs.get(0); + existsDO.setCode(queryDept.getCode()).setName(existsDO.getName()).setLeaderUserId(leaderUserId).setDeptId(parentId); + updateList.add(existsDO); + }else{ + WorkshopDO aDO = BeanUtils.toBean(queryDept, WorkshopDO.class); + aDO.setDeptId(parentId).setLeaderUserId(leaderUserId); + insertList.add(aDO); + } + }); + + // 入库 + if(CollUtil.isNotEmpty(updateList)) workshopMapper.updateBatch(updateList); + if(CollUtil.isNotEmpty(insertList)) workshopMapper.insertBatch(insertList); + + // 禁用 + workshopMapper.update(new LambdaUpdateWrapper(){{ + notIn(WorkshopDO::getId, queryDeptGroupById.keySet()).set(WorkshopDO::getStatus, ValidStatusEnum.INVALID.getCode()); + }}); + } + } + } + + /** + * 获取客户数据 + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public void queryCustomer() throws ChanjetApiException { + // 设置为“否”,关闭所有与用友通信的接口 + if(!getSystemParameters()) return; + String maxTs = null; + do { + QueryPartnerReqVO.QueryPartnerParamVO paramVO = new QueryPartnerReqVO.QueryPartnerParamVO(maxTs); + CommonResult> result = chanjetSpi.invokeRetList(QUERY_CUSTOMER, new QueryPartnerReqVO(paramVO), QueryPartnerResVO.class); + if(!result.isSuccess()){ + throw exception(CALL_API_ERROR); + } + if(CollUtil.isNotEmpty(result.getData())){ + + // 取最大 ts + QueryPartnerResVO maxTsVO = result.getData().stream().sorted(Comparator.comparing((d) -> 0 - Long.parseLong(d.getTS().substring(2), 16))).findFirst().get(); + maxTs = maxTsVO.getTS(); + + List dataList = result.getData().stream().filter(vo -> vo.getPartnerType().getName().indexOf("客户") > -1).collect(Collectors.toList()); + + if(CollUtil.isNotEmpty(dataList)){ + + Map> dataGroupById = dataList.stream().collect(Collectors.groupingBy(QueryPartnerResVO::getID)); + + List customerDOList = customerMapper.selectList(new LambdaQueryWrapper() {{ + in(CustomerDO::getId, dataGroupById.keySet()); + }}); + Map> existsDOGroupById = customerDOList.stream().collect(Collectors.groupingBy(CustomerDO::getId)); + + + + // 处理 + ArrayList insertList = new ArrayList<>(16); + ArrayList updateList = new ArrayList<>(16); + dataGroupById.forEach((id, voList) -> { + QueryPartnerResVO vo = voList.get(0); + List existsDOs = existsDOGroupById.get(id); + + if(CollUtil.isNotEmpty(existsDOs)){ + CustomerDO existsDO = existsDOs.get(0); + existsDO.setCode(vo.getCode()) + .setBrief(vo.getPartnerAbbName()) + .setStatus(!vo.getDisabled() ? ValidStatusEnum.VALID.getCode() : ValidStatusEnum.INVALID.getCode()) + .setName(vo.getName()); + updateList.add(existsDO); + }else{ + CustomerDO aDO = new CustomerDO(); + aDO.setId(vo.getID()) + .setCode(vo.getCode()) + .setBrief(vo.getPartnerAbbName()) + .setStatus(!vo.getDisabled() ? ValidStatusEnum.VALID.getCode() : ValidStatusEnum.INVALID.getCode()) + .setName(vo.getName()); + insertList.add(aDO); + } + }); + + // 入库 + if(CollUtil.isNotEmpty(updateList)) customerMapper.updateBatch(updateList); + if(CollUtil.isNotEmpty(insertList)) customerMapper.insertBatch(insertList); + + if(result.getData().size() < paramVO.getPageSize()){ + maxTs = null; + } + } + }else{ + maxTs = null; + } + + }while (maxTs != null); + + } + + /** + * 获取供应商数据 + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public void querySupplier() throws ChanjetApiException { + // 设置为“否”,关闭所有与用友通信的接口 + if(!getSystemParameters()) return; + String maxTs = null; + do { + QueryPartnerReqVO.QueryPartnerParamVO paramVO = new QueryPartnerReqVO.QueryPartnerParamVO(maxTs); + CommonResult> result = chanjetSpi.invokeRetList(QUERY_SUPPLIER, new QueryPartnerReqVO(paramVO), QueryPartnerResVO.class); + if(!result.isSuccess()){ + throw exception(CALL_API_ERROR); + } + if(CollUtil.isNotEmpty(result.getData())){ + + // 取最大 ts + QueryPartnerResVO maxTsVO = result.getData().stream().sorted(Comparator.comparing((d) -> 0 - Long.parseLong(d.getTS().substring(2), 16))).findFirst().get(); + maxTs = maxTsVO.getTS(); + + List dataList = result.getData().stream().filter(vo -> vo.getPartnerType().getName().indexOf("供应商") > -1).collect(Collectors.toList()); + + if(CollUtil.isNotEmpty(dataList)){ + Map> dataGroupById = dataList.stream().collect(Collectors.groupingBy(QueryPartnerResVO::getID)); + + List doList = supplierMapper.selectList(new LambdaQueryWrapper() {{ + in(SupplierDO::getId, dataGroupById.keySet()); + }}); + Map> existsDOGroupById = doList.stream().collect(Collectors.groupingBy(SupplierDO::getId)); + + + + // 处理 + ArrayList insertList = new ArrayList<>(16); + ArrayList updateList = new ArrayList<>(16); + dataGroupById.forEach((id, voList) -> { + QueryPartnerResVO vo = voList.get(0); + List existsDOs = existsDOGroupById.get(id); + + if(CollUtil.isNotEmpty(existsDOs)){ + SupplierDO existsDO = existsDOs.get(0); + existsDO.setCode(vo.getCode()) + .setBrief(vo.getPartnerAbbName()) + .setStatus(!vo.getDisabled() ? ValidStatusEnum.VALID.getCode() : ValidStatusEnum.INVALID.getCode()) + .setName(vo.getName()); + updateList.add(existsDO); + }else{ + SupplierDO aDO = new SupplierDO(); + aDO.setId(vo.getID()) + .setCode(vo.getCode()) + .setBrief(vo.getPartnerAbbName()) + .setStatus(!vo.getDisabled() ? ValidStatusEnum.VALID.getCode() : ValidStatusEnum.INVALID.getCode()) + .setName(vo.getName()); + insertList.add(aDO); + } + }); + + // 入库 + if(CollUtil.isNotEmpty(updateList)) supplierMapper.updateBatch(updateList); + if(CollUtil.isNotEmpty(insertList)) supplierMapper.insertBatch(insertList); + + if(result.getData().size() < paramVO.getPageSize()){ + maxTs = null; + } + } + + }else{ + maxTs = null; + } + + }while (maxTs != null); + + } + + /** + * 创建工序 + * @param createReqVO + * @return + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public Long createProcedure(ProcedureSaveReqVO createReqVO) throws ChanjetApiException { + + Long procedureId = procedureService.createProcedure(createReqVO); + + ProcedureDO procedure = procedureService.getProcedure(procedureId); + String wCode = null; + Long wid = procedure.getWid(); + if(wid != null){ + WorkshopDO workshop = workshopMapper.selectById(wid); + wCode = workshop.getCode(); + } + + CreateProcedureDTO dto = new CreateProcedureDTO(); + dto.setDisabled(procedure.getStatus() == ValidStatusEnum.INVALID.getCode()) + .setMemo(procedure.getDescription()) + .setWorkshop(new WorkShopDTO(wCode)) + .setSalaryType(new SalaryType(procedure.getSalaryType())) + .setKeyProcess(procedure.getIsFinal() == YesOrNoEnum.Y.getCode()) + .setStandardWorkingHours(procedure.getStandard1Time()) + .setPieceworkBasis(new PieceworkBasis(procedure.getPieceworkBasis())) + .setHourLabourPrice(procedure.getStandardLabourPrice()) + .setName(procedure.getName()) + .setCode(procedure.getCode()); + + // 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口 + if(getSystemParameters()) { + CommonResult result = chanjetSpi.invoke(CREATE_PROCEDURE, new CreateProcedureReqVO(dto), Long.class); + if (!result.isSuccess()) { + throw exception(CALL_API_ERROR); + } + } + return procedureId; + } + + /** + * 创建用户 + * @param reqVO + * @return + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public Long createUser(UserSaveReqVO reqVO) throws ChanjetApiException { + + Long id = adminUserService.createUser(reqVO); + + AdminUserDO aDO = adminUserService.getUser(id); + String deptCode = null; + if(aDO.getDeptId() != null){ + DeptDO deptDO = deptMapper.selectById(aDO.getDeptId()); + deptCode = deptDO.getCode(); + } + + CreateOrUpdateEmployeeDTO dto = new CreateOrUpdateEmployeeDTO(); + dto.setName(aDO.getNickname()) + .setMobilePhoneNo(aDO.getMobile()) + .setDisabled(aDO.getStatus() != YesOrNoEnum.N.getCode()) + .setCode(aDO.getUsername()) + ; + + if(!StringUtils.isEmpty(deptCode)){ + dto.setDepartment(new Department(deptCode)); + } + // 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口 + if(getSystemParameters()) { + CommonResult result = chanjetSpi.invoke(CREATE_EMPLOYEE, new CreateOrUpdateEmployeeReqVO(dto), Long.class); + if (!result.isSuccess()) { + throw exception(CALL_API_ERROR); + } + } + return id; + } + + /** + * 更新用户 + * @param reqVO + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public void updateUser(UserSaveReqVO reqVO) throws ChanjetApiException { + + adminUserService.updateUser(reqVO); + + AdminUserDO aDO = adminUserService.getUser(reqVO.getId()); + + String deptCode = null; + if(aDO.getDeptId() != null){ + DeptDO deptDO = deptMapper.selectById(aDO.getId()); + deptCode = deptDO.getCode(); + } + + CreateOrUpdateEmployeeDTO dto = new CreateOrUpdateEmployeeDTO(); + dto.setName(aDO.getNickname()) + .setMobilePhoneNo(aDO.getMobile()) + .setDisabled(aDO.getStatus() != YesOrNoEnum.N.getCode()) + .setCode(aDO.getUsername()) + ; + + if(!StringUtils.isEmpty(deptCode)){ + dto.setDepartment(new Department(deptCode)); + } + // 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口 + if(getSystemParameters()) { + CommonResult result = chanjetSpi.invoke(UPDATE_EMPLOYEE, new CreateOrUpdateEmployeeReqVO(dto), Boolean.class); + if (!result.isSuccess()) { + throw exception(CALL_API_ERROR); + } + } + } + + /** + * 查询物料 + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public void queryMaterial() throws ChanjetApiException { + // 设置为“否”,关闭所有与用友通信的接口 + if(!getSystemParameters()) return ; + String maxTs = null; + HashSet materialIds = new HashSet<>(); + do { + QueryMaterialReqVO.QueryMaterialParamVO paramVO = new QueryMaterialReqVO.QueryMaterialParamVO(maxTs); + CommonResult> result = chanjetSpi.invokeRetList(QUERY_INVENTORY, new QueryMaterialReqVO(paramVO), QueryMaterialResVO.class); + if(!result.isSuccess()){ + throw exception(CALL_API_ERROR); + } + if(CollUtil.isNotEmpty(result.getData())){ + + List dataList = result.getData(); + Map> dataGroupById = dataList.stream().collect(Collectors.groupingBy(QueryMaterialResVO::getID)); + materialIds.addAll(dataGroupById.keySet()); + + List doList = materialMapper.selectList(new LambdaQueryWrapper() {{ + in(MaterialDO::getId, dataGroupById.keySet()); + }}); + Map> existsDOGroupById = doList.stream().collect(Collectors.groupingBy(MaterialDO::getId)); + + // 取最大 ts + QueryMaterialResVO maxTsVO = dataList.stream().sorted(Comparator.comparing((d) -> 0 - Long.parseLong(d.getTS().substring(2), 16))).findFirst().get(); + maxTs = maxTsVO.getTS(); + + // 处理 + ArrayList insertList = new ArrayList<>(16); + ArrayList updateList = new ArrayList<>(16); + dataGroupById.forEach((id, voList) -> { + QueryMaterialResVO vo = voList.get(0); + List existsDOs = existsDOGroupById.get(id); + + if(CollUtil.isNotEmpty(existsDOs)){ + MaterialDO aDO = existsDOs.get(0); + aDO.setCode(vo.getCode()) + .setStatus(!vo.getDisabled() ? ValidStatusEnum.VALID.getCode() : ValidStatusEnum.INVALID.getCode()) + .setName(vo.getName()) + .setShortName(vo.getShorthand()) + .setSpec(vo.getSpecification()) + .setDescription(vo.getInventoryDescript()) + .setInventoryProperty(vo.getInventoryProperty()) + ; + if(vo.getUnitByStock() != null && !StringUtils.isEmpty(vo.getUnitByStock().getName())){ + aDO.setUnit(vo.getUnitByStock().getName()); + } + if(vo.getInventoryClass() != null && !StringUtils.isEmpty(vo.getInventoryClass().getCode())){ + aDO.setMaterialType(vo.getInventoryClass().getCode()); + }else{ + aDO.setMaterialType(MaterialTypeEnum.UNKNOWN.getCode()); + } + if(vo.getProductInfo() != null && !StringUtils.isEmpty(vo.getProductInfo().getName())){ + aDO.setBrand(vo.getProductInfo().getName()); + } + if(!StringUtils.isEmpty(vo.getImageFile())){ + aDO.setLogo(vo.getImageFile()); + } + updateList.add(aDO); + }else{ + MaterialDO aDO = new MaterialDO(); + aDO.setId(vo.getID()) + .setCode(vo.getCode()) + .setStatus(!vo.getDisabled() ? ValidStatusEnum.VALID.getCode() : ValidStatusEnum.INVALID.getCode()) + .setName(vo.getName()) + .setShortName(vo.getShorthand()) + .setSpec(vo.getSpecification()) + .setDescription(vo.getInventoryDescript()) + .setInventoryProperty(vo.getInventoryProperty()) + ; + if(vo.getUnitByStock() != null && !StringUtils.isEmpty(vo.getUnitByStock().getName())){ + aDO.setUnit(vo.getUnitByStock().getName()); + } + if(vo.getInventoryClass() != null && !StringUtils.isEmpty(vo.getInventoryClass().getCode())){ + aDO.setMaterialType(vo.getInventoryClass().getCode()); + }else{ + aDO.setMaterialType(MaterialTypeEnum.UNKNOWN.getCode()); + } + if(vo.getProductInfo() != null && !StringUtils.isEmpty(vo.getProductInfo().getName())){ + aDO.setBrand(vo.getProductInfo().getName()); + } + if(!StringUtils.isEmpty(vo.getImageFile())){ + aDO.setLogo(vo.getImageFile()); + } + insertList.add(aDO); + } + }); + + // 入库 + if(CollUtil.isNotEmpty(updateList)) materialMapper.updateBatch(updateList); + if(CollUtil.isNotEmpty(insertList)) materialMapper.insertBatch(insertList); + + // 提取分类插入字典 + List allMaterialTypeList = dataList.stream().filter(vo -> vo.getInventoryClass() != null && !StringUtils.isEmpty(vo.getInventoryClass().getCode()) && !StringUtils.isEmpty(vo.getInventoryClass().getName())) + .collect(Collectors.toList()); + insertMaterialTypeFromMaterialData(allMaterialTypeList); + + // 提取单位插入字典 + List allMaterialUnitList = dataList.stream().filter(vo -> vo.getUnitByStock() != null && !StringUtils.isEmpty(vo.getUnitByStock().getName())) + .collect(Collectors.toList()); + insertMaterialUnitFromMaterialData(allMaterialUnitList); + + if(result.getData().size() < paramVO.getPageSize()){ + maxTs = null; + } + }else{ + maxTs = null; + } + + }while (maxTs != null); + + // 删除 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper(){{ + }}; + if(!materialIds.isEmpty()){ + wrapper.notIn(MaterialDO::getId, materialIds); + } + materialMapper.delete(wrapper); + } + + /** + * 提取单位插入字典 + * @param allMaterialTypeList + */ + private void insertMaterialUnitFromMaterialData(List allMaterialTypeList) { + ArrayList materialTypeDOList = new ArrayList<>(); + ArrayList insertTypeList = new ArrayList<>(16); + ArrayList updateTypeList = new ArrayList<>(16); + + allMaterialTypeList.forEach(vo -> { + DictDataDO data = new DictDataDO(); + data.setDictType(DictTypeConstants.MATERIAL_UNIT.getCode()) + .setValue(vo.getUnitByStock().getName()) + .setLabel(vo.getUnitByStock().getName()) + .setStatus(SystemValidStatusEnum.VALID.getCode()); + materialTypeDOList.add(data); + }); + Map> typeGroupByValue = materialTypeDOList.stream().collect(Collectors.groupingBy(DictDataDO::getValue)); + + // 查询已生成字段 + List existsDictDataList = dictDataMapper.selectList(new LambdaQueryWrapper() {{ + eq(DictDataDO::getDictType, DictTypeConstants.MATERIAL_UNIT.getCode()); + in(DictDataDO::getValue, typeGroupByValue.keySet()); + }}); + Map> existsGroupByValue = existsDictDataList.stream().collect(Collectors.groupingBy(DictDataDO::getValue)); + typeGroupByValue.forEach((val, typeDataList) -> { + DictDataDO newDO = typeDataList.get(0); + List existsDataList = existsGroupByValue.get(val); + if(CollUtil.isNotEmpty(existsDataList)){ + DictDataDO existsDO = existsDataList.get(0); + existsDO.setLabel(newDO.getLabel()); + updateTypeList.add(existsDO); + }else{ + insertTypeList.add(newDO); + } + }); + + if(CollUtil.isNotEmpty(updateTypeList)) dictDataMapper.updateBatch(updateTypeList); + if(CollUtil.isNotEmpty(insertTypeList)) dictDataMapper.insertBatch(insertTypeList); + } + + /** + * 提取分类插入字典 + * @param allMaterialTypeList + */ + private void insertMaterialTypeFromMaterialData(List allMaterialTypeList) { + ArrayList materialTypeDOList = new ArrayList<>(); + ArrayList insertTypeList = new ArrayList<>(16); + ArrayList updateTypeList = new ArrayList<>(16); + + allMaterialTypeList.forEach(vo -> { + DictDataDO data = new DictDataDO(); + data.setDictType(DictTypeConstants.MATERIAL_TYPE.getCode()) + .setValue(vo.getInventoryClass().getCode()) + .setLabel(vo.getInventoryClass().getName()) + .setStatus(SystemValidStatusEnum.VALID.getCode()); + materialTypeDOList.add(data); + }); + Map> typeGroupByValue = materialTypeDOList.stream().collect(Collectors.groupingBy(DictDataDO::getValue)); + + // 查询已生成字段 + List existsDictDataList = dictDataMapper.selectList(new LambdaQueryWrapper() {{ + eq(DictDataDO::getDictType, DictTypeConstants.MATERIAL_TYPE.getCode()); + in(DictDataDO::getValue, typeGroupByValue.keySet()); + }}); + Map> existsGroupByValue = existsDictDataList.stream().collect(Collectors.groupingBy(DictDataDO::getValue)); + typeGroupByValue.forEach((val, typeDataList) -> { + DictDataDO newDO = typeDataList.get(0); + List existsDataList = existsGroupByValue.get(val); + if(CollUtil.isNotEmpty(existsDataList)){ + DictDataDO existsDO = existsDataList.get(0); + existsDO.setLabel(newDO.getLabel()); + updateTypeList.add(existsDO); + }else{ + insertTypeList.add(newDO); + } + }); + + if(CollUtil.isNotEmpty(updateTypeList)) dictDataMapper.updateBatch(updateTypeList); + if(CollUtil.isNotEmpty(insertTypeList)) dictDataMapper.insertBatch(insertTypeList); + } + + /** + * 查询订单数据 + * 1:只同步用友中的已经审核的销售订单; + * 2:审核的单据到我们这边以后需要判断是否已经存在该销售订单号对应的生产订单: + * 1)若存在,不处理; + * 2)若不存在,直接生成生产订单并下发; + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public void queryProjectOrder() throws ChanjetApiException { + // 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口 + if(!getSystemParameters()) return ; + int pageIndex = 0; + boolean hasMore = false; + List resulDataList = new ArrayList<>(32); + do { + QuerySaleOrderListReqVO paramVO = new QuerySaleOrderListReqVO(pageIndex); + CommonResult retResult = chanjetSpi.invoke(QUERY_SALE_ORDER_LIST, paramVO, ListResultResVO.class); + if(!retResult.isSuccess()){ + throw new RuntimeException(retResult.getMsg()); + } + ListResultResVO result = retResult.getData(); + if(!result.isSuccess()){ + throw new RuntimeException(result.getMessage()); + } + + ListResultDataDTO resultData = result.getData(); + if(resultData != null && CollUtil.isNotEmpty(resultData.getRows())){ + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); + // 转化对象 + List> dataLists = resultData.getRows(); + dataLists.forEach(values -> { + QuerySaleOrderListResDTO resDTO = new QuerySaleOrderListResDTO(); + resDTO.setExternalId(values.get(0)); + resDTO.setExternalCode(values.get(1)); + resDTO.setCustomerId(ChanjetSpi.getIdPrefix()+Long.parseLong(values.get(2))); + resDTO.setMaterialId(ChanjetSpi.getIdPrefix()+Long.parseLong(values.get(3))); + resDTO.setUnit(values.get(4)); + resDTO.setAmount(new BigDecimal(values.get(5)).intValue()); + resDTO.setWarehouseId(StringUtils.isEmpty(values.get(6)) ? null : ChanjetSpi.getIdPrefix()+Long.parseLong(values.get(6))); + resDTO.setOrderTime(LocalDateTime.parse(values.get(7)+" 00:00:00", df)); + resulDataList.add(resDTO); + }); + hasMore = dataLists.size() == paramVO.getPageSize(); + + }else{ + hasMore = false; + } + + }while (hasMore); + + // 处理数据 + if(!resulDataList.isEmpty()){ + Map> dataGroupByCode = resulDataList.stream().collect(Collectors.groupingBy(QuerySaleOrderListResDTO::getExternalCode)); + + List doList = projectOrderMapper.selectList(new LambdaQueryWrapper() {{ + in(ProjectOrderDO::getExternalCode, dataGroupByCode.keySet()); + eq(ProjectOrderDO::getOrderSource, ProjectOrderSourceEnum.INTERFACE.getCode()); + }}); + Map> existsDOGroupByCode = doList.stream().collect(Collectors.groupingBy(ProjectOrderDO::getExternalCode)); + + // 处理 + dataGroupByCode.forEach((id, voList) -> { + QuerySaleOrderListResDTO vo = voList.get(0); + List existsDOs = existsDOGroupByCode.get(id); + + if(CollUtil.isEmpty(existsDOs)){ + // 新增 + ProjectOrderSaveReqVO saveReqVO = new ProjectOrderSaveReqVO(); + List subDOList = new ArrayList<>(16); + BeanUtil.copyProperties(vo, saveReqVO); + + saveReqVO.setStatus(ValidStatusEnum.VALID.getCode()) + .setOrderSource(ProjectOrderSourceEnum.INTERFACE.getCode()) + .setOrderStatus(ProjectOrderStatusEnum.SAVE.getCode()) + .setIsUrgency(YesOrNoEnum.N.getCode()) + .setActive(OperateTypeEnum.SAVE.name()); + + // 子项目处理 + // 相同物料累计数量 + voList.stream().collect(Collectors.groupingBy(QuerySaleOrderListResDTO::getMaterialId)).forEach((mid, mList) -> { + ProjectOrderSubDO subDO = new ProjectOrderSubDO(); + BeanUtil.copyProperties(mList.get(0), subDO); + + subDO.setAmount(mList.stream().mapToInt(QuerySaleOrderListResDTO::getAmount).sum()); + subDOList.add(subDO); + }); + + saveReqVO.setProjectOrderSubs(subDOList); + projectOrderController.operateProjectOrder(saveReqVO); + } + }); + } + } + + /** + * 查询bom + * + * @param materialCode + * @param warehouseId + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public List queryProcessBom(String materialCode, Long warehouseId) throws ChanjetApiException { + + List resultData = new ArrayList<>(16); + + List bomDataList = null; + // 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口 + if(getSystemParameters()) { + CommonResult> result = chanjetSpi.invokeRetList(QUERY_BOM, new QueryBomReqVO(new QueryBomReqVO.QueryBomDTO(materialCode)), QueryBomResVO.class); + if (!result.isSuccess()) { + throw exception(CALL_API_ERROR); + } + if (CollUtil.isNotEmpty(result.getData())) { + QueryBomResVO topLayer = result.getData().get(0); + bomDataList = topLayer.getBOMChildDTOs(); + if (CollUtil.isNotEmpty(bomDataList)) { + for (BOMChildDTOs dto : bomDataList) { + ChildBOM childBOM = dto.getChildBOM(); + if (childBOM != null) { + dto.setVersion(childBOM.getVersion()) + .setBOMChildDTOs(queryProcessBomById(childBOM.getID())); + } + } + } + } + } + + // 数据包装 + if(CollUtil.isNotEmpty(bomDataList)){ + for (BOMChildDTOs dto : bomDataList) { + resultData.addAll(getChildrenBomMaterial(2, dto.getBOMChildDTOs(), warehouseId)); + dto.setBOMChildDTOs(null); // 避免重复数据 + resultData.addAll(getChildrenBomMaterial(1, Arrays.asList(dto), warehouseId)); + } + resultData.sort(Comparator.comparing(BomMaterialVO::getSort)); + } + + return resultData; + } + + public List getChildrenBomMaterial(int layer, List childrenBomList, Long warehouseId) throws ChanjetApiException { + List resultData = new ArrayList<>(16); + if (CollUtil.isNotEmpty(childrenBomList)){ + List stockList = queryStock(childrenBomList.stream().map(BOMChildDTOs::getInventory).map(Inventory::getCode).collect(Collectors.toList()), warehouseId); + Map> stockGroupByCode = stockList.stream().collect(Collectors.groupingBy(QueryCurrentStockResVO::getInventoryCode)); + for (int i = 0; i < childrenBomList.size(); i++) { + BOMChildDTOs dto = childrenBomList.get(i); + QueryCurrentStockResVO stockData = stockGroupByCode.get(dto.getInventory().getCode()).get(0); + BomMaterialVO bomMaterialVO = new BomMaterialVO(); + bomMaterialVO.setLayer(layer) + .setLayerSort(layer+"."+(i+1)) + .setSort(layer*1000+(i+1)) + .setProjectSubCode(stockData.getInventoryCode()) + .setProjectSubName(stockData.getInventoryName()) + .setMaterialId(stockData.getInventoryID()) + .setMaterialType(stockData.getInventoryClassCode()) + .setSpec(stockData.getSpecification()) + .setIsVirtual(dto.getInventory().getIsPhantom() ? YesOrNoEnum.Y.getCode() : YesOrNoEnum.N.getCode()) + .setBomVersion(dto.getVersion()) + .setStockQuantity(new BigDecimal(stockData.getAvailableQuantity())) + .setUnit(stockData.getUnitName()); + resultData.add(bomMaterialVO); + + resultData.addAll(getChildrenBomMaterial(layer+1, dto.getBOMChildDTOs(), warehouseId)); + } + } + return resultData; + } + + /** + * 查询存货 + * + * @param materialCodeList + * @param warehouseId + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public List queryStock(List materialCodeList, Long warehouseId) throws ChanjetApiException { + List dataList = null; + // 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口 + if(getSystemParameters()) { + CommonResult> result = chanjetSpi.invokeRetList(QUERY_CURRENT_STOCK, new QueryCurrentStockReqVO(new QueryCurrentStockReqVO.QueryCurrentStockParamVO(materialCodeList)), QueryCurrentStockResVO.class); + if (!result.isSuccess()) { + throw exception(CALL_API_ERROR); + } + dataList = result.getData(); + } + + if(dataList == null) dataList = new ArrayList<>(16); + + List materialDOList = materialMapper.selectList(MaterialDO::getCode, materialCodeList); + Map> materialsGroupByCode = materialDOList.stream().collect(Collectors.groupingBy(MaterialDO::getCode)); + + // 无存货信息,物料信息从物料表取 + for (String code : materialCodeList) { + MaterialDO aDo = materialsGroupByCode.get(code).get(0); + List currentStockList = dataList.stream().filter(vo -> code.equals(vo.getInventoryCode())).collect(Collectors.toList()); + if(CollUtil.isEmpty(currentStockList)){ + QueryCurrentStockResVO resVO = new QueryCurrentStockResVO(); + resVO.setInventoryCode(code) + .setInventoryName(aDo.getName()) + .setInventoryClassCode(aDo.getMaterialType()) + .setSpecification(aDo.getSpec()) + .setUnitID(aDo.getUnit()) + .setUnitName(aDo.getUnit()) + .setInventoryID(aDo.getId()) + .setAvailableQuantity("0"); + dataList.add(resVO); + }else{ + currentStockList.forEach(currentStock -> { + if(!StringUtils.isEmpty(currentStock.getSpecification())){ + currentStock.setSpecification(aDo.getSpec()); + } + if(warehouseId != null && currentStock.getWarehouseID().longValue() != warehouseId.longValue()){ + currentStock.setAvailableQuantity("0"); + } + }); + } + } + + return dataList; + } + + /** + * 查询存货 + * + * @param materialDOList + * @param warehouseId + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public void queryStockAndInject(List materialDOList, Long warehouseId) throws ChanjetApiException { + // 设置为“否”,关闭所有与用友通信的接口 + if(!getSystemParameters()) return ; + CommonResult> result = chanjetSpi.invokeRetList(QUERY_CURRENT_STOCK, + new QueryCurrentStockReqVO(new QueryCurrentStockReqVO.QueryCurrentStockParamVO(materialDOList.stream().map(MaterialDO::getCode).collect(Collectors.toList()))), + QueryCurrentStockResVO.class); + if(!result.isSuccess()){ + throw exception(CALL_API_ERROR); + } + List dataList = result.getData(); + if(dataList == null) dataList = new ArrayList<>(16); + + for (MaterialDO aDo : materialDOList) { + List stockResVOList = dataList.stream().filter(vo -> vo.getWarehouseID().longValue() == warehouseId.longValue() && aDo.getCode().equals(vo.getInventoryCode())).collect(Collectors.toList()); + if(CollUtil.isEmpty(stockResVOList)){ + aDo.setStockQuantity(new BigDecimal(0)); + }else{ + QueryCurrentStockResVO resVO = stockResVOList.get(0); + BigDecimal stockQuantity = new BigDecimal(resVO.getAvailableQuantity());; + if(warehouseId != null && resVO.getWarehouseID().longValue() != warehouseId.longValue()){ + stockQuantity = new BigDecimal(0); + } + aDo.setStockQuantity(stockQuantity); + } + } + } + + /** + * 查询存货 + * + * @param doList + * @param warehouseId + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public void queryStockAndInject2(List doList, Long warehouseId) throws ChanjetApiException { + // 设置为“否”,关闭所有与用友通信的接口 + if(!getSystemParameters()) return; + CommonResult> result = chanjetSpi.invokeRetList(QUERY_CURRENT_STOCK, + new QueryCurrentStockReqVO(new QueryCurrentStockReqVO.QueryCurrentStockParamVO(doList.stream().map(StorageMatDO::getProjectSubCode).collect(Collectors.toList()))), + QueryCurrentStockResVO.class); + if(!result.isSuccess()){ + throw exception(CALL_API_ERROR); + } + List dataList = result.getData(); + if(dataList == null) dataList = new ArrayList<>(16); + + for (StorageMatDO aDo : doList) { + List stockResVOList = dataList.stream().filter(vo -> aDo.getProjectSubCode().equals(vo.getInventoryCode())).collect(Collectors.toList()); + if(CollUtil.isEmpty(stockResVOList)){ + aDo.setStockQuantity(new BigDecimal(0)); + }else{ + QueryCurrentStockResVO resVO = stockResVOList.get(0); + BigDecimal stockQuantity = new BigDecimal(resVO.getAvailableQuantity());; + if(warehouseId != null && resVO.getWarehouseID().longValue() != warehouseId.longValue()){ + stockQuantity = new BigDecimal(0); + } + aDo.setStockQuantity(stockQuantity); + } + } + } + + /** + * 通过id查询bom + * @param bomId + * @return + * @throws ChanjetApiException + */ + private List queryProcessBomById(String bomId) throws ChanjetApiException { + // 设置为“否”,关闭所有与用友通信的接口 + if(!getSystemParameters()) return null; + List resultData = null; + QueryBomReqVO.QueryBomDTO queryBomDTO = new QueryBomReqVO.QueryBomDTO(); + queryBomDTO.setID(bomId); + CommonResult> result = chanjetSpi.invokeRetList(QUERY_BOM, new QueryBomReqVO(queryBomDTO), QueryBomResVO.class); + if(!result.isSuccess()){ + throw exception(CALL_API_ERROR); + } + if(CollUtil.isNotEmpty(result.getData())){ + QueryBomResVO topLayer = result.getData().get(0); + resultData = topLayer.getBOMChildDTOs(); + if(CollUtil.isNotEmpty(resultData)){ + for (BOMChildDTOs dto : resultData) { + ChildBOM childBOM = dto.getChildBOM(); + if(childBOM != null){ + dto.setBOMChildDTOs(queryProcessBomById(childBOM.getID())); + } + } + } + } + return resultData; + } + + + + /** + * 创建报工 + * @param id + * @return + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public void createTaskReport(Long id) throws ChanjetApiException { + + TaskReportDO aDO = taskReportMapper.selectOne(id); + TaskDispatchDetailDO taskDispatchDetailDO = taskDispatchDetailMapper.getTaskDispatchDetail(aDO.getDispatchDetailId()); + + CreateReportDto dto = new CreateReportDto(); + + dto.setVoucherDate(new SimpleDateFormat("yyyy-MM-dd").format(new Date())) + .setBusinessType(new BusinessType()) + .setExternalCode(Long.toString(aDO.getId())) + .setInventory(new Inventory(taskDispatchDetailDO.getProjectSubCode())) + ; + + ArrayList manufactureReportDetails = new ArrayList<>(16); + dto.setManufactureReportDetails(manufactureReportDetails); + ManufactureReportDetails reportDetail = new ManufactureReportDetails(); + ArrayList reportTeamDetails = new ArrayList<>(); + manufactureReportDetails.add(reportDetail); + reportDetail.setQuantity(aDO.getAmount()) + .setWorkShop(new WorkShopDTO(taskDispatchDetailDO.getWorkshopCode())) + .setManufactureReportTeamDetails(reportTeamDetails) + .setSourceVoucherId(taskDispatchDetailDO.getProductionId()) + .setSourceVoucherDetailId(taskDispatchDetailDO.getProductionDetailId()) + ; + ManufactureReportTeamDetails reportTeamDetail = new ManufactureReportTeamDetails(); + reportTeamDetails.add(reportTeamDetail); + reportTeamDetail.setPerson(new Person(aDO.getOwnerUsername())); + + // 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口 + if(getSystemParameters()) { + CommonResult result = chanjetSpi.invoke(CREATE_REPORT, new CreateReportReqVO(dto), ResultResVO.class); + if (!result.isSuccess()) { + throw exception(CALL_API_ERROR); + } + } + } + + /** + * 删除报工 + * @param id + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public void deleteTaskReport(Long id) throws ChanjetApiException { + + taskReportService.deleteTaskReport(id); + // do nothing + } + + /** + * 创建出库单 + * @param id + * @return + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public void createStockOutOrder(Long id) throws ChanjetApiException { + + StorageDO storage = storageMapper.selectById(id); + List matList = storageMatService.getStorageMatListByStockId(id); + if(matList.isEmpty()) return; + + WarehouseDO aDo = warehouseMapper.selectById(storage.getWhId()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + CreateStockOutDTO dto = new CreateStockOutDTO(); + ArrayList detailList = new ArrayList<>(); + dto.setExternalCode(storage.getStockNo()) + .setVoucherDate(sdf.format(new Date())) + .setRDRecordDetails(detailList) + .setWarehouse(new Warehouse(aDo.getWhNo())) + ; + + matList.forEach(mat -> { + RDRecordDetail detail = new RDRecordDetail(); + detail.setCode(String.valueOf(mat.getId())).setBaseQuantity(mat.getStorageOkQty()) + .setInventory(new Inventory(mat.getProjectSubCode())); + detailList.add(detail); + }); + + // 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口 + if(getSystemParameters()) { + CommonResult result = chanjetSpi.invoke(CREATE_STOCK_OUT_ORDER, new CreateStockOutOrderReqVO(dto), ResultResVO.class); + if (!result.isSuccess()) { + throw exception(CALL_API_ERROR); + } + } + } + + /** + * 创建入库单 + * @param id + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public void createStorageInOrder(Long id) throws ChanjetApiException { + StorageDO storage = storageMapper.selectById(id); + List matList = storageMatService.getStorageMatListByStockId(id); + if(matList.isEmpty()) return; + + WarehouseDO aDo = warehouseMapper.selectById(storage.getWhId()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + CreateStockInDTO dto = new CreateStockInDTO(); + ArrayList detailList = new ArrayList<>(); + dto.setExternalCode(storage.getStockNo()) + .setVoucherDate(sdf.format(new Date())) + .setRDRecordDetails(detailList) + .setWarehouse(new Warehouse(aDo.getWhNo())) + ; + + matList.forEach(mat -> { + RDRecordDetail detail = new RDRecordDetail(); + detail.setCode(String.valueOf(mat.getId())).setBaseQuantity(mat.getStorageOkQty()) + .setInventory(new Inventory(mat.getProjectSubCode())); + detailList.add(detail); + }); + + // 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口 + if(getSystemParameters()){ + CommonResult result = chanjetSpi.invoke(CREATE_STOCK_IN_ORDER, new CreateStorageReqVO(dto), ResultResVO.class); + if(!result.isSuccess()){ + throw exception(CALL_API_ERROR); + } + } + + } + + /** + * 创建生产加工单 + * @param id + * @throws ChanjetApiException + */ + @Transactional(rollbackFor = Exception.class) + public void createProductionOrder(Long id) throws ChanjetApiException { + ProjectOrderDO aDo = projectOrderService.getProjectOrder(id); + List allSubDOList = projectOrderService.getProjectOrderSubListByProjectOrderId(id); + if(CollUtil.isEmpty(allSubDOList)) return; + + // 过滤生成加工单明细 + List subDOList = allSubDOList.stream().filter(subDO -> StringUtils.isEmpty(subDO.getProductionId())).collect(Collectors.toList()); + if(CollUtil.isEmpty(subDOList)) return; + + String dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(aDo.getProjectStartTime()); + + // anyone + WorkshopDO workshopDO = workshopMapper.selectOne(new LambdaQueryWrapper() {{ + orderByDesc(WorkshopDO::getId).last("LIMIT 1"); + }}); + + CreateProductionOrderDto dto = new CreateProductionOrderDto(); + ArrayList detailList = new ArrayList<>(16); + String externalCode = aDo.getCode()+"-"+subDOList.stream().sorted(Comparator.comparing(ProjectOrderSubDO::getId)).map(subDO -> String.valueOf(subDO.getId())).collect(Collectors.joining("-")); + dto.setExternalCode(externalCode) + // 任意车间 + .setDepartment(new Department(workshopDO.getCode())) + .setVoucherDate(dateFormat) + .setManufactureOrderDetails(detailList); + + subDOList.forEach(subDO -> { + ManufactureOrderDetails detail = new ManufactureOrderDetails(); + DictDataDO dictDataDO = dictDataMapper.selectByDictTypeAndValue(DictTypeConstants.MATERIAL_UNIT.getCode(), subDO.getUnit()); + + detail.setInventory(new Inventory(subDO.getProjectSubCode())) + .setUnit(new Unit(dictDataDO.getLabel())) + .setQuantity(subDO.getAmount()) + .setPreStartDate(aDo.getProjectStartTime().format(DateTimeFormatter.ISO_DATE)) + .setPreFinishDate(aDo.getProjectEndTime().format(DateTimeFormatter.ISO_DATE)) + ; + detailList.add(detail); + }); + // 设置为“是”,打开所有与用友通信的接口 + if(getSystemParameters()) { + CommonResult result = chanjetSpi.invoke(CREATE_PRODUCTION_ORDER, new CreateProductionOrderReqVO(dto), ResultResVO.class); + if (!result.isSuccess() || !result.getData().isSuccess()) { + throw exception(CALL_API_ERROR); + } + + // 暂不考虑失败场景 TODO 重试接口 + CommonResult result2 = chanjetSpi.invoke(AUDIT_PRODUCTION_ORDER, new AuditProductionOrderReqVO(new AuditProductionOrderReqVO.AuditProductionOrderParamVO(externalCode)), ResultResVO.class); + if (!result2.isSuccess() || !result2.getData().isSuccess()) { + throw new RuntimeException(result2.getMsg()); + } + + Map rMap = JSON.parseObject(JSON.toJSONString(result.getData().getData()), new TypeReference>() {{ + }}); + // 查询报工单数据 将id回写至子项目表 + Map> subGroupByProjectSubCode = subDOList.stream().collect(Collectors.groupingBy(ProjectOrderSubDO::getProjectSubCode)); + CommonResult listResult = chanjetSpi.invoke(QUERY_PRODUCTION_ORDER_LIST, new ListProductionOrderReqVO(rMap.get("Code")), ListResultResVO.class); + if (!listResult.isSuccess() || listResult.getData() == null || listResult.getData().getData() == null || listResult.getData().getData().getTotalCount() == 0) { + throw new RuntimeException("queryProductionOrder exception: " + JSON.toJSONString(listResult)); + } + + List> listDataList = listResult.getData().getData().getRows(); + for (int i = 0; i < listDataList.size(); i++) { + // orderId projectSubCode detailId + List item = listDataList.get(i); + ProjectOrderSubDO subDO = subGroupByProjectSubCode.get(item.get(1)).get(0); + subDO.setProductionId(item.get(0)) + .setProductionDetailId(item.get(2)); + } + projectOrderSubMapper.updateBatch(subDOList); + } + } + + /** + * 查询仓库 + * @author chenxi + * @date 2024-05-11 09:58 + */ + @Transactional(rollbackFor = Exception.class) + public void queryWarehouse() throws ChanjetApiException { + // 设置为“否”,关闭所有与用友通信的接口 + if(!getSystemParameters()) return ; + CommonResult> result = chanjetSpi.invokeRetList(QUERY_WAREHOUSE, new QueryWarehouseReqVO(), QueryWarehouseResVO.class); + if(!result.isSuccess()){ + throw exception(CALL_API_ERROR); + } + if(CollUtil.isNotEmpty(result.getData())){ + + List dataList = result.getData(); + Map> queryDataGroupById = dataList.stream().collect(Collectors.groupingBy(QueryWarehouseResVO::getID)); + + ArrayList insertList = new ArrayList<>(16); + ArrayList updateList = new ArrayList<>(16); + + List existsDOList = warehouseMapper.selectList(new LambdaQueryWrapper() {{ + in(WarehouseDO::getId, dataList.stream().map(QueryWarehouseResVO::getID).collect(Collectors.toList())); + }}); + Map> existsDOGroupById = existsDOList.stream().collect(Collectors.groupingBy(WarehouseDO::getId)); + + // 处理 + queryDataGroupById.forEach((id, voList) -> { + QueryWarehouseResVO queryData = voList.get(0); + List existsDOs = existsDOGroupById.get(id); + if(CollUtil.isNotEmpty(existsDOs)){ + WarehouseDO existsDO = existsDOs.get(0); + existsDO.setWhNo(queryData.getCode()).setWhName(existsDO.getWhName()) + .setWhStatus(queryData.getDisabled() ? ValidStatusEnum.INVALID.getCode() : ValidStatusEnum.VALID.getCode()); + updateList.add(existsDO); + }else{ + WarehouseDO aDo = new WarehouseDO(); + aDo.setWhNo(queryData.getCode()) + .setWhName(queryData.getName()) + .setId(queryData.getID()) + .setWhStatus(queryData.getDisabled() ? ValidStatusEnum.INVALID.getCode() : ValidStatusEnum.VALID.getCode()) + .setCreator("1") + ; + insertList.add(aDo); + } + }); + + // 入库 + if(CollUtil.isNotEmpty(updateList)) warehouseMapper.updateBatch(updateList); + if(CollUtil.isNotEmpty(insertList)) warehouseMapper.insertBatch(insertList); + } + } +}