diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/ProductionDetailController.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/ProductionDetailController.java index c3501444..0585ad62 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/ProductionDetailController.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/ProductionDetailController.java @@ -8,9 +8,12 @@ import com.win.framework.operatelog.core.annotations.OperateLog; import com.win.module.system.api.user.AdminUserApi; import com.win.module.system.api.user.dto.AdminUserRespDTO; import com.win.module.wms.controller.production.vo.*; +import com.win.module.wms.controller.work.vo.WorkMainExcelVO; import com.win.module.wms.convert.production.ProductionDetailConvert; import com.win.module.wms.dal.dataobject.production.ProductionDetailDO; +import com.win.module.wms.dal.dataobject.production.ProductionMainDO; import com.win.module.wms.service.production.ProductionDetailService; +import com.win.module.wms.service.production.ProductionMainService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -23,7 +26,9 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static com.win.framework.common.pojo.CommonResult.success; import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @@ -37,6 +42,9 @@ public class ProductionDetailController { @Resource private ProductionDetailService productionDetailService; + @Resource + private ProductionMainService productionMainService; + @Resource private AdminUserApi userApi; @@ -90,23 +98,6 @@ public class ProductionDetailController { return success(ProductionDetailConvert.INSTANCE.convertPage(pageResult)); } - @GetMapping("/export-excel") - @Operation(summary = "导出生产计划子 Excel") - @PreAuthorize("@ss.hasPermission('wms:production-detail:export')") - @OperateLog(type = EXPORT) - public void exportProductionDetailExcel(@Valid ProductionDetailExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = productionDetailService.getProductionDetailList(exportReqVO); - // 导出 Excel - List datas = ProductionDetailConvert.INSTANCE.convertList02(list); - for(ProductionDetailExcelVO vo : datas) { - AdminUserRespDTO user = userApi.getUser(Long.valueOf(vo.getCreator())); - //后端创建个字段作为前端展示的虚拟字段 - vo.setCreator(user.getNickname()); - } - ExcelUtils.write(response, "生产计划子.xls", "数据", ProductionDetailExcelVO.class, datas); - } - @PostMapping("/senior") @Operation(summary = "高级搜索获得生产计划子分页") @PreAuthorize("@ss.hasPermission('wms:production-detail:query')") diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/ProductionMainController.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/ProductionMainController.java index af9cb6e8..a6df9a38 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/ProductionMainController.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/ProductionMainController.java @@ -11,9 +11,15 @@ import com.win.module.system.api.user.AdminUserApi; import com.win.module.system.api.user.dto.AdminUserRespDTO; import com.win.module.wms.controller.production.vo.*; import com.win.module.wms.controller.purchaseclaimRequest.vo.PurchaseclaimRequestImportVO; +import com.win.module.wms.controller.work.vo.WorkMainExcelVO; import com.win.module.wms.convert.production.ProductionMainConvert; +import com.win.module.wms.convert.work.WorkMainConvert; +import com.win.module.wms.dal.dataobject.production.ProductionDetailDO; import com.win.module.wms.dal.dataobject.production.ProductionMainDO; +import com.win.module.wms.dal.dataobject.work.WorkDetailDO; +import com.win.module.wms.dal.dataobject.work.WorkMainDO; import com.win.module.wms.enums.DictTypeConstants; +import com.win.module.wms.service.production.ProductionDetailService; import com.win.module.wms.service.production.ProductionMainService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -43,10 +49,10 @@ public class ProductionMainController { @Resource private ProductionMainService productionMainService; - + @Resource + private ProductionDetailService productionDetailService; @Resource private AdminUserApi userApi; - @PostMapping("/create") @Operation(summary = "创建生产计划主") @PreAuthorize("@ss.hasPermission('wms:production-main:create')") @@ -97,23 +103,6 @@ public class ProductionMainController { return success(ProductionMainConvert.INSTANCE.convertPage(pageResult)); } - @GetMapping("/export-excel") - @Operation(summary = "导出生产计划主 Excel") - @PreAuthorize("@ss.hasPermission('wms:production-main:export')") - @OperateLog(type = EXPORT) - public void exportProductionMainExcel(@Valid ProductionMainExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = productionMainService.getProductionMainList(exportReqVO); - // 导出 Excel - List datas = ProductionMainConvert.INSTANCE.convertList02(list); - for(ProductionMainExcelVO vo : datas) { - AdminUserRespDTO user = userApi.getUser(Long.valueOf(vo.getCreator())); - //后端创建个字段作为前端展示的虚拟字段 - vo.setCreator(user.getNickname()); - } - ExcelUtils.write(response, "生产计划主.xls", "数据", ProductionMainExcelVO.class, datas); - } - @PostMapping("/senior") @Operation(summary = "高级搜索获得生产计划主分页") @PreAuthorize("@ss.hasPermission('wms:production-main:query')") @@ -128,18 +117,68 @@ public class ProductionMainController { return success(result); } + private List getExcelVo(List list, Map mapDropDown) { + String[] available = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.TRUE_FALSE); + mapDropDown.put(13, available); + List resultList = new ArrayList<>(); + // 导出 + for(ProductionMainDO mainDO : list) { + List subList = productionDetailService.selectList(mainDO.getId()); + for(ProductionDetailDO detailDO : subList) { + ProductionMainExcelVO vo = ProductionMainConvert.INSTANCE.convert(mainDO, detailDO); + resultList.add(vo); + } + } + return resultList; + } + + @GetMapping("/export-excel") + @Operation(summary = "导出生产计划主 Excel") + @PreAuthorize("@ss.hasPermission('wms:production-main:export')") + @OperateLog(type = EXPORT) + public void exportProductionMainExcel(@Valid ProductionMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = productionMainService.getProductionMainList(exportReqVO); + //组装vo + Map mapDropDown = new HashMap<>(); + List resultList = this.getExcelVo(list, mapDropDown); + for(ProductionMainExcelVO vo : resultList) { + //后端创建个字段作为前端展示的虚拟字段 + vo.setCreator(userApi.getUser(Long.valueOf(vo.getCreator())).getNickname()); + //后端创建个字段作为前端展示的虚拟字段 + vo.setUpdater(userApi.getUser(Long.valueOf(vo.getUpdater())).getNickname()); + } + ExcelUtils.write(response, "生产计划.xls", "生产计划", ProductionMainExcelVO.class, resultList); + } + + @GetMapping("/export-excel-senior") + @Operation(summary = "导出生产计划主 Excel") + @PreAuthorize("@ss.hasPermission('wms:production-main:export')") + @OperateLog(type = EXPORT) + public void exportProductionMainSeniorExcel(@Valid @RequestBody CustomConditions conditions, HttpServletResponse response) throws IOException { + List list = productionMainService.getProductionMainList(conditions); + //组装vo + Map mapDropDown = new HashMap<>(); + List resultList = this.getExcelVo(list, mapDropDown); + for(ProductionMainExcelVO vo : resultList) { + //后端创建个字段作为前端展示的虚拟字段 + vo.setCreator(userApi.getUser(Long.valueOf(vo.getCreator())).getNickname()); + //后端创建个字段作为前端展示的虚拟字段 + vo.setUpdater(userApi.getUser(Long.valueOf(vo.getUpdater())).getNickname()); + } + ExcelUtils.write(response, "生产计划.xlsx", "生产计划", ProductionMainExcelVO.class, resultList, mapDropDown); + } + @GetMapping("/get-import-template") - @Operation(summary = "获得导入生产计划信息模板") + @Operation(summary = "获得导入生产计划模板") public void importTemplate(HttpServletResponse response) throws IOException { // 手动创建导出 demo - List list = new ArrayList<>(); + List list = new ArrayList<>(); Map mapDropDown = new HashMap<>(); - String[] purchaseReturnReason = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.PURCHASE_RETURN_REASON); - mapDropDown.put(16, purchaseReturnReason); String[] uom = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.UOM); - mapDropDown.put(25, uom); + mapDropDown.put(11, uom); // 输出 - ExcelUtils.write(response, "生产计划信息导入模板.xlsx", "生产计划信息列表", PurchaseclaimRequestImportVO.class, list, mapDropDown); + ExcelUtils.write(response, "生产计划导入模板.xlsx", "生产计划", ProductionMainImportVO.class, list, mapDropDown); } @PostMapping("/import") @@ -161,10 +200,74 @@ public class ProductionMainController { Map returnMap = new HashMap<>(); returnMap.put("errorCount", errorList.size()); if(!errorList.isEmpty()) { - String url = ExcelUtils.writeLocalFile("生产计划基本信息导入错误数据" + LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) + ".xlsx", "错误列表", errorList); + String url = ExcelUtils.writeLocalFile("生产计划信息导入错误数据" + LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) + ".xlsx", "错误列表", errorList); returnMap.put("errorFile", url); } return success(returnMap); } + @PutMapping("/close") + @Operation(summary = "关闭生产计划") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('wms:production-main:close')") + public CommonResult closeProductionMain(@RequestParam("id") Long id) { + Integer count = productionMainService.closeProductionMain(id); + return success(count > 0); + } + + @PutMapping("/submit") + @Operation(summary = "提交生产计划") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('wms:production-main:submit')") + public CommonResult submitProductionMain(@RequestParam("id") Long id) { + Integer count = productionMainService.submitProductionMain(id); + return success(count > 0); + } + + @PutMapping("/open") + @Operation(summary = "打开生产计划") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('wms:production-main:open')") + public CommonResult openProductionMain(@RequestParam("id") Long id) { + Integer count = productionMainService.openProductionMain(id); + return success(count > 0); + } + + @PutMapping("/reject") + @Operation(summary = "驳回生产计划") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('wms:production-main:reject')") + public CommonResult rejectProductionMain(@RequestParam("id") Long id) { + Integer count = productionMainService.rejectProductionMain(id); + return success(count > 0); + } + + @PutMapping("/agree") + @Operation(summary = "审批通过生产计划") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('wms:production-main:agree')") + public CommonResult agreeProductionMain(@RequestParam("id") Long id) { + Integer count = productionMainService.agreeProductionMain(id); + return success(count > 0); + } + + @PutMapping("/publish") + @Operation(summary = "发布生产计划") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('wms:production-main:publish')") + public CommonResult publishProductionMain(@RequestParam("id") Long id) { + Integer count = productionMainService.publishProductionMain(id); + return success(count > 0); + } + + @PutMapping("/resetting") + @Operation(summary = "重置生产计划") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('wms:production-main:resetting')") + public CommonResult resettingProductionMain(@RequestParam("id") Long id) { + Integer count = productionMainService.resettingProductionMain(id); + return success(count > 0); + } + + } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/vo/ProductionMainBaseVO.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/vo/ProductionMainBaseVO.java index 36d09875..f431479f 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/vo/ProductionMainBaseVO.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/vo/ProductionMainBaseVO.java @@ -1,5 +1,6 @@ package com.win.module.wms.controller.production.vo; +import com.win.framework.excel.core.annotations.OnlyOne; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -44,6 +45,7 @@ public class ProductionMainBaseVO { private LocalDateTime planDate; @Schema(description = "单据号") + @OnlyOne private String number; @Schema(description = "业务类型") diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/vo/ProductionMainExcelVO.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/vo/ProductionMainExcelVO.java index 2bdaf20e..dc2f0bda 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/vo/ProductionMainExcelVO.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/vo/ProductionMainExcelVO.java @@ -1,7 +1,10 @@ package com.win.module.wms.controller.production.vo; +import com.win.module.wms.enums.DictTypeConstants; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; + +import java.math.BigDecimal; import java.util.*; import java.time.LocalDateTime; import java.time.LocalDateTime; @@ -74,9 +77,35 @@ public class ProductionMainExcelVO { @ExcelProperty("是否可用") private String available; - @ExcelProperty("订单号") - private String woNumber; + @ExcelProperty("Bom版本") + private String bomVersion; + + @ExcelProperty("合格数量") + private BigDecimal goodQty; + + @ExcelProperty("不合格数量") + private BigDecimal notGoodQty; + + @ExcelProperty("物品代码") + private String itemCode; + + @ExcelProperty("计划数量") + private BigDecimal planQty; + + @ExcelProperty("计量单位") + @DictFormat(DictTypeConstants.UOM) + private String uom; + + @ExcelProperty("是否可用") + @DictFormat(DictTypeConstants.TRUE_FALSE) + private String availableDetail; + + @ExcelProperty("备注") + private String remarkDetail; - @ExcelProperty("订单行") - private String woLine; +// @ExcelProperty("订单号") +// private String woNumber; +// +// @ExcelProperty("订单行") +// private String woLine; } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/vo/ProductionMainImportVO.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/vo/ProductionMainImportVO.java index 2e424461..6881dffd 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/vo/ProductionMainImportVO.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/production/vo/ProductionMainImportVO.java @@ -2,17 +2,24 @@ package com.win.module.wms.controller.production.vo; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.annotations.OnlyOne; +import com.win.module.wms.enums.DictTypeConstants; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; +import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.time.LocalDateTime; +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + /** - * 采购索赔申请子 Excel VO + * 生产计划 Excel VO * * @author 超级管理员 */ @@ -23,41 +30,53 @@ import java.time.LocalDateTime; public class ProductionMainImportVO { @ExcelProperty("单据号") + @NotNull private String number; @ExcelProperty("顺序") - private String hang; + @NotNull + private Integer displayOrder; @ExcelProperty("车间") - private String supplierCode; + @NotNull + private String workshop; @ExcelProperty("生产线") - private String contactName; + @NotNull + private String productionLine; @ExcelProperty("班次") - @ColumnWidth(value = 16) - private String contactPhone; + @NotNull + private String shift; @ExcelProperty("班组") - @ColumnWidth(value = 16) - private String contactEmail; - - @ExcelProperty("计划日期") - private LocalDateTime isConsignment; + @NotNull + private String team; - @ExcelProperty("订单行") - private String woLine; + @ExcelProperty("开始日期") + @NotNull + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime beginTime; - @ExcelProperty("订单号") - private String woNumber; + @ExcelProperty("结束日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime endTime; //子表数据 @ExcelProperty("Bom版本") - private String itemCode; + @NotNull + private String bomVersion; @ExcelProperty("物品代码") - private BigDecimal orderQty; + @NotNull + private String itemCode; @ExcelProperty("计划数量") - private String uom; + @NotNull + private BigDecimal planQty; + @ExcelProperty("计量单位") - private BigDecimal overReceivingPercent; + @NotNull + @DictFormat(DictTypeConstants.UOM) + private String uom; + + } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/production/ProductionMainConvert.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/production/ProductionMainConvert.java index f922efc1..92e5877e 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/production/ProductionMainConvert.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/production/ProductionMainConvert.java @@ -4,11 +4,11 @@ import java.util.*; import com.win.framework.common.pojo.PageResult; -import com.win.module.wms.controller.production.vo.ProductionMainCreateReqVO; -import com.win.module.wms.controller.production.vo.ProductionMainExcelVO; -import com.win.module.wms.controller.production.vo.ProductionMainRespVO; -import com.win.module.wms.controller.production.vo.ProductionMainUpdateReqVO; +import com.win.module.wms.controller.production.vo.*; +import com.win.module.wms.dal.dataobject.production.ProductionDetailDO; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; import com.win.module.wms.dal.dataobject.production.ProductionMainDO; @@ -34,4 +34,21 @@ public interface ProductionMainConvert { List convertList02(List list); + @Mappings({ + @Mapping(source = "mainDO.number", target = "number"), + }) + ProductionMainImportErrorVO convert(ProductionMainCreateReqVO mainDO, ProductionDetailDO detailDO); + + @Mappings({ + @Mapping(source = "mainDO.number", target = "number"), + @Mapping(source = "mainDO.remark", target = "remark"), + @Mapping(source = "mainDO.createTime", target = "createTime"), + @Mapping(source = "mainDO.creator", target = "creator"), + @Mapping(source = "mainDO.updateTime", target = "updateTime"), + @Mapping(source = "mainDO.updater", target = "updater"), + @Mapping(source = "mainDO.available", target = "available"), + @Mapping(source = "detailDO.available", target = "availableDetail"), + @Mapping(source = "detailDO.remark", target = "remarkDetail"), + }) + ProductionMainExcelVO convert(ProductionMainDO mainDO, ProductionDetailDO detailDO); } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/dataobject/production/ProductionMainDO.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/dataobject/production/ProductionMainDO.java index 39da10bd..73475635 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/dataobject/production/ProductionMainDO.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/dataobject/production/ProductionMainDO.java @@ -109,13 +109,13 @@ public class ProductionMainDO extends BaseDO { */ private String available; - /** - * 订单号 - */ - private String woNumber; - /** - * 订单行 - */ - private String woLine; +// /** +// * 订单号 +// */ +// private String woNumber; +// /** +// * 订单行 +// */ +// private String woLine; } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/production/ProductionDetailMapper.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/production/ProductionDetailMapper.java index 2feabc8d..c1496d99 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/production/ProductionDetailMapper.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/production/ProductionDetailMapper.java @@ -8,6 +8,7 @@ import com.win.framework.mybatis.core.util.QueryWrapperUtils; import com.win.module.wms.controller.production.vo.ProductionDetailExportReqVO; import com.win.module.wms.controller.production.vo.ProductionDetailPageReqVO; import com.win.module.wms.dal.dataobject.production.ProductionDetailDO; +import com.win.module.wms.dal.dataobject.work.WorkDetailDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -42,22 +43,26 @@ public interface ProductionDetailMapper extends BaseMapperX return selectPage(conditions, QueryWrapperUtils.structure(conditions)); } - default List selectList(ProductionDetailExportReqVO reqVO) { + default List selectList(Long masterId) { return selectList(new LambdaQueryWrapperX() - .eqIfPresent(ProductionDetailDO::getBomVersion, reqVO.getBomVersion()) - .eqIfPresent(ProductionDetailDO::getGoodQty, reqVO.getGoodQty()) - .eqIfPresent(ProductionDetailDO::getNotGoodQty, reqVO.getNotGoodQty()) - .eqIfPresent(ProductionDetailDO::getNumber, reqVO.getNumber()) - .eqIfPresent(ProductionDetailDO::getItemCode, reqVO.getItemCode()) - .eqIfPresent(ProductionDetailDO::getRemark, reqVO.getRemark()) - .betweenIfPresent(ProductionDetailDO::getCreateTime, reqVO.getCreateTime()) - .eqIfPresent(ProductionDetailDO::getCreator, reqVO.getCreator()) - .eqIfPresent(ProductionDetailDO::getPlanQty, reqVO.getPlanQty()) - .eqIfPresent(ProductionDetailDO::getUom, reqVO.getUom()) - .betweenIfPresent(ProductionDetailDO::getUpdateTime, reqVO.getUpdateTime()) - .eqIfPresent(ProductionDetailDO::getUpdater, reqVO.getUpdater()) - .eqIfPresent(ProductionDetailDO::getAvailable, reqVO.getAvailable()) - .orderByDesc(ProductionDetailDO::getId)); + .eq(ProductionDetailDO::getMasterId, masterId)); } +// default List selectList(ProductionDetailExportReqVO reqVO) { +// return selectList(new LambdaQueryWrapperX() +// .eqIfPresent(ProductionDetailDO::getBomVersion, reqVO.getBomVersion()) +// .eqIfPresent(ProductionDetailDO::getGoodQty, reqVO.getGoodQty()) +// .eqIfPresent(ProductionDetailDO::getNotGoodQty, reqVO.getNotGoodQty()) +// .eqIfPresent(ProductionDetailDO::getNumber, reqVO.getNumber()) +// .eqIfPresent(ProductionDetailDO::getItemCode, reqVO.getItemCode()) +// .eqIfPresent(ProductionDetailDO::getRemark, reqVO.getRemark()) +// .betweenIfPresent(ProductionDetailDO::getCreateTime, reqVO.getCreateTime()) +// .eqIfPresent(ProductionDetailDO::getCreator, reqVO.getCreator()) +// .eqIfPresent(ProductionDetailDO::getPlanQty, reqVO.getPlanQty()) +// .eqIfPresent(ProductionDetailDO::getUom, reqVO.getUom()) +// .betweenIfPresent(ProductionDetailDO::getUpdateTime, reqVO.getUpdateTime()) +// .eqIfPresent(ProductionDetailDO::getUpdater, reqVO.getUpdater()) +// .eqIfPresent(ProductionDetailDO::getAvailable, reqVO.getAvailable()) +// .orderByDesc(ProductionDetailDO::getId)); +// } } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/production/ProductionMainMapper.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/production/ProductionMainMapper.java index 7da5cf6c..6d0972aa 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/production/ProductionMainMapper.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/production/ProductionMainMapper.java @@ -8,6 +8,7 @@ import com.win.framework.mybatis.core.util.QueryWrapperUtils; import com.win.module.wms.controller.production.vo.ProductionMainExportReqVO; import com.win.module.wms.controller.production.vo.ProductionMainPageReqVO; import com.win.module.wms.dal.dataobject.production.ProductionMainDO; +import com.win.module.wms.dal.dataobject.work.WorkMainDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -39,8 +40,8 @@ public interface ProductionMainMapper extends BaseMapperX { .betweenIfPresent(ProductionMainDO::getUpdateTime, reqVO.getUpdateTime()) .eqIfPresent(ProductionMainDO::getUpdater, reqVO.getUpdater()) .eqIfPresent(ProductionMainDO::getAvailable, reqVO.getAvailable()) - .eqIfPresent(ProductionMainDO::getWoNumber, reqVO.getWoNumber()) - .eqIfPresent(ProductionMainDO::getWoLine, reqVO.getWoLine()) +// .eqIfPresent(ProductionMainDO::getWoNumber, reqVO.getWoNumber()) +// .eqIfPresent(ProductionMainDO::getWoLine, reqVO.getWoLine()) .orderByDesc(ProductionMainDO::getId)); } @@ -71,9 +72,12 @@ public interface ProductionMainMapper extends BaseMapperX { .betweenIfPresent(ProductionMainDO::getUpdateTime, reqVO.getUpdateTime()) .eqIfPresent(ProductionMainDO::getUpdater, reqVO.getUpdater()) .eqIfPresent(ProductionMainDO::getAvailable, reqVO.getAvailable()) - .eqIfPresent(ProductionMainDO::getWoNumber, reqVO.getWoNumber()) - .eqIfPresent(ProductionMainDO::getWoLine, reqVO.getWoLine()) +// .eqIfPresent(ProductionMainDO::getWoNumber, reqVO.getWoNumber()) +// .eqIfPresent(ProductionMainDO::getWoLine, reqVO.getWoLine()) .orderByDesc(ProductionMainDO::getId)); } + default List selectSeniorList(CustomConditions conditions) { + return selectList(QueryWrapperUtils.structure(conditions)); + } } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionDetailService.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionDetailService.java index f73fb216..59be627d 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionDetailService.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionDetailService.java @@ -32,14 +32,14 @@ public interface ProductionDetailService { * * @param updateReqVO 更新信息 */ - void updateProductionDetail(@Valid ProductionDetailUpdateReqVO updateReqVO); + Integer updateProductionDetail(@Valid ProductionDetailUpdateReqVO updateReqVO); /** * 删除生产计划子 * * @param id 编号 */ - void deleteProductionDetail(Long id); + Integer deleteProductionDetail(Long id); /** * 获得生产计划子 @@ -71,7 +71,7 @@ public interface ProductionDetailService { * @param exportReqVO 查询条件 * @return 生产计划子列表 */ - List getProductionDetailList(ProductionDetailExportReqVO exportReqVO); +// List getProductionDetailList(ProductionDetailExportReqVO exportReqVO); /** * 获得用高级搜索户分页列表 @@ -81,4 +81,5 @@ public interface ProductionDetailService { */ PageResult getProductionDetailSenior(CustomConditions conditions); + List selectList(Long masterId); } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionDetailServiceImpl.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionDetailServiceImpl.java index dd5a1efe..82db2998 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionDetailServiceImpl.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionDetailServiceImpl.java @@ -2,15 +2,24 @@ package com.win.module.wms.service.production; import com.win.framework.common.pojo.CustomConditions; import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.api.trends.TrendsApi; +import com.win.module.infra.enums.TrendsTypeEnum; +import com.win.module.system.api.dict.DictDataApi; import com.win.module.wms.controller.production.vo.ProductionDetailCreateReqVO; import com.win.module.wms.controller.production.vo.ProductionDetailExportReqVO; import com.win.module.wms.controller.production.vo.ProductionDetailPageReqVO; import com.win.module.wms.controller.production.vo.ProductionDetailUpdateReqVO; import com.win.module.wms.convert.production.ProductionDetailConvert; import com.win.module.wms.dal.dataobject.accountcalendar.AccountcalendarDO; +import com.win.module.wms.dal.dataobject.itembasic.ItembasicDO; import com.win.module.wms.dal.dataobject.production.ProductionDetailDO; +import com.win.module.wms.dal.dataobject.production.ProductionMainDO; import com.win.module.wms.dal.mysql.production.ProductionDetailMapper; +import com.win.module.wms.service.bom.BomService; +import com.win.module.wms.service.itembasic.ItembasicService; +import com.win.module.wms.service.productionlineitem.ProductionlineitemService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; @@ -18,6 +27,7 @@ import java.util.Collection; import java.util.List; import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.wms.enums.ErrorCodeConstants.ITEMBASIC_UOM_EXCEPTION; import static com.win.module.wms.enums.ErrorCodeConstants.PRODUCTION_DETAIL_NOT_EXISTS; /** @@ -29,33 +39,53 @@ import static com.win.module.wms.enums.ErrorCodeConstants.PRODUCTION_DETAIL_NOT_ @Validated public class ProductionDetailServiceImpl implements ProductionDetailService { + @Resource + private BomService bomService; + @Resource + private ProductionlineitemService productionlineitemService; + @Resource + private DictDataApi dictDataApi; + @Resource + private ItembasicService itembasicService; @Resource private ProductionDetailMapper productionDetailMapper; + @Resource + private TrendsApi trendsApi; + @Resource + private ProductionMainService productionMainService; @Override + @Transactional public Long createProductionDetail(ProductionDetailCreateReqVO createReqVO) { // 插入 ProductionDetailDO productionDetail = ProductionDetailConvert.INSTANCE.convert(createReqVO); + validateProductionDetailCreate(productionDetail); productionDetailMapper.insert(productionDetail); + trendsApi.createTrends(productionDetail.getId(), "productionDetail", "增加了生产计划子表", TrendsTypeEnum.CREATE); // 返回 return productionDetail.getId(); } @Override - public void updateProductionDetail(ProductionDetailUpdateReqVO updateReqVO) { + @Transactional + public Integer updateProductionDetail(ProductionDetailUpdateReqVO updateReqVO) { // 校验存在 validateProductionDetailExists(updateReqVO.getId()); // 更新 ProductionDetailDO updateObj = ProductionDetailConvert.INSTANCE.convert(updateReqVO); - productionDetailMapper.updateById(updateObj); + validateProductionDetailCreate(updateObj); + trendsApi.createTrends(updateObj.getId(), "productionDetail", "更新了生产计划子表", TrendsTypeEnum.UPDATE); + return productionDetailMapper.updateById(updateObj); } @Override - public void deleteProductionDetail(Long id) { + @Transactional + public Integer deleteProductionDetail(Long id) { // 校验存在 validateProductionDetailExists(id); // 删除 - productionDetailMapper.deleteById(id); + trendsApi.createTrends(id, "productionDetail", "删除了生产计划子表", TrendsTypeEnum.DELETE); + return productionDetailMapper.deleteById(id); } private void validateProductionDetailExists(Long id) { @@ -79,13 +109,35 @@ public class ProductionDetailServiceImpl implements ProductionDetailService { return productionDetailMapper.selectPage(pageReqVO); } - @Override - public List getProductionDetailList(ProductionDetailExportReqVO exportReqVO) { - return productionDetailMapper.selectList(exportReqVO); - } +// @Override +// public List getProductionDetailList(ProductionDetailExportReqVO exportReqVO) { +// return productionDetailMapper.selectList(exportReqVO); +// } @Override public PageResult getProductionDetailSenior(CustomConditions conditions) { return productionDetailMapper.selectSenior(conditions); } + + @Override + public List selectList(Long masterId) { + return productionDetailMapper.selectList(masterId); + } + + /** + * 新增校验 + * @param detailDo + * @return + */ + private void validateProductionDetailCreate(ProductionDetailDO detailDo) { + // 校验物品代码 + ItembasicDO itembasicDO = itembasicService.selectItembasic(detailDo.getItemCode()); + if (!itembasicDO.getUom().equals(detailDo.getUom())) { + throw exception(ITEMBASIC_UOM_EXCEPTION, dictDataApi.selectDictValue(detailDo.getUom()).getLabel(), dictDataApi.selectDictValue(itembasicDO.getUom()).getLabel()); + } + // 校验生产线和物品关系 + productionlineitemService.productionLineCodeAndpItemCodeExist(productionMainService.getProductionMain(detailDo.getMasterId()).getProductionLine(), detailDo.getItemCode()); + // 校验物品和bom关系 + bomService.bomItemCodeAndVersionExist(detailDo.getItemCode(), detailDo.getBomVersion()); + } } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionMainService.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionMainService.java index 1e9db347..85e5733f 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionMainService.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionMainService.java @@ -5,6 +5,7 @@ import com.win.framework.common.pojo.PageResult; import com.win.module.wms.controller.production.vo.*; import com.win.module.wms.dal.dataobject.production.ProductionDetailDO; import com.win.module.wms.dal.dataobject.production.ProductionMainDO; +import com.win.module.wms.dal.dataobject.work.WorkMainDO; import javax.validation.Valid; import java.util.Collection; @@ -88,12 +89,39 @@ public interface ProductionMainService { PageResult getProductionMainSenior(CustomConditions conditions); /** - * 批量导入采购索赔申请主信息 - * @param datas 导入采购索赔申请主信息列表 + * 获得生产计划主列表, 用于 Excel 导出 + * + * @param conditions 查询条件 + * @return 生产计划主列表 + */ + List getProductionMainList(CustomConditions conditions); + + /** + * 批量导入生产计划信息 + * @param datas 导入生产计划主信息列表 * @param mode 导入模式1更新2追加3覆盖 * @param updatePart 是否支持更新 * @return 导入结果 */ public List importProductionMainList(List datas, Integer mode, boolean updatePart); + /** + * 关闭生产计划 + * + * @param id 生产计划ID + * @return 更新数量 + */ + Integer closeProductionMain(Long id); + + Integer submitProductionMain(Long id); + + Integer openProductionMain(Long id); + + Integer rejectProductionMain(Long id); + + Integer agreeProductionMain(Long id); + + Integer publishProductionMain(Long id); + + Integer resettingProductionMain(Long id); } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionMainServiceImpl.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionMainServiceImpl.java index c02188ea..e5654752 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionMainServiceImpl.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/production/ProductionMainServiceImpl.java @@ -2,25 +2,52 @@ package com.win.module.wms.service.production; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.exceptions.UtilException; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.pojo.CommonResult; import com.win.framework.common.pojo.CustomConditions; import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.validation.ValidationUtils; import com.win.framework.dict.core.util.DictFrameworkUtils; +import com.win.module.infra.api.trends.TrendsApi; +import com.win.module.infra.enums.TrendsTypeEnum; +import com.win.module.system.api.dict.DictDataApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; import com.win.module.wms.controller.production.vo.*; +import com.win.module.wms.controller.work.vo.WorkDetailCreateReqVO; +import com.win.module.wms.controller.work.vo.WorkMainImportErrorVO; import com.win.module.wms.convert.production.ProductionDetailConvert; import com.win.module.wms.convert.production.ProductionMainConvert; +import com.win.module.wms.convert.purchasereceiptRequest.PurchasereceiptRequestDetailConvert; +import com.win.module.wms.convert.work.WorkDetailConvert; +import com.win.module.wms.convert.work.WorkMainConvert; import com.win.module.wms.dal.dataobject.businesstype.BusinesstypeDO; import com.win.module.wms.dal.dataobject.itembasic.ItembasicDO; import com.win.module.wms.dal.dataobject.production.ProductionDetailDO; import com.win.module.wms.dal.dataobject.production.ProductionMainDO; import com.win.module.wms.dal.dataobject.productionline.ProductionlineDO; +import com.win.module.wms.dal.dataobject.purchasereceiptRequest.PurchasereceiptRequestDetailDO; +import com.win.module.wms.dal.dataobject.purchasereceiptRequest.PurchasereceiptRequestMainDO; +import com.win.module.wms.dal.dataobject.requestsetting.RequestsettingDO; import com.win.module.wms.dal.dataobject.team.TeamDO; +import com.win.module.wms.dal.dataobject.work.WorkDetailDO; +import com.win.module.wms.dal.dataobject.work.WorkMainDO; +import com.win.module.wms.dal.mysql.documentSwitch.SwitchMapper; +import com.win.module.wms.dal.mysql.documentsetting.DocumentsettingMapper; +import com.win.module.wms.dal.mysql.preparetoissue.PreparetoissueMainMapper; import com.win.module.wms.dal.mysql.production.ProductionDetailMapper; import com.win.module.wms.dal.mysql.production.ProductionMainMapper; import com.win.module.wms.dal.mysql.productreceiptJob.ProductreceiptJobDetailMapper; +import com.win.module.wms.dal.mysql.productreceiptRequest.ProductreceiptRequestMainMapper; import com.win.module.wms.enums.DictTypeConstants; +import com.win.module.wms.enums.plan.PlanStatusState; +import com.win.module.wms.enums.request.RequestStatusEnum; +import com.win.module.wms.enums.request.RequestStatusState; +import com.win.module.wms.service.bom.BomService; import com.win.module.wms.service.itembasic.ItembasicService; +import com.win.module.wms.service.preparetoissue.PreparetoissueMainService; import com.win.module.wms.service.productionline.ProductionlineService; import com.win.module.wms.service.productionlineitem.ProductionlineitemService; import com.win.module.wms.service.shift.ShiftService; @@ -29,19 +56,29 @@ import com.win.module.wms.service.team.TeamService; import com.win.module.wms.service.work.WorkMainService; import com.win.module.wms.service.workshop.WorkshopService; import com.win.module.wms.util.JobUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import javax.annotation.Resource; +import javax.validation.Validator; import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collection; +import java.util.Date; import java.util.List; import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.win.module.wms.enums.ErrorCodeConstants.PRODUCTION_MAIN_NOT_EXISTS; -import static com.win.module.wms.enums.ErrorCodeConstants.PURCHASECLAIM_REQUEST_IMPORT_LIST_IS_EMPTY; +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.module.wms.enums.ErrorCodeConstants.*; /** * 生产计划主 Service 实现类 @@ -52,6 +89,19 @@ import static com.win.module.wms.enums.ErrorCodeConstants.PURCHASECLAIM_REQUEST_ @Validated public class ProductionMainServiceImpl implements ProductionMainService { + @Resource + private SwitchMapper switchMapper; + @Resource + private DictDataApi dictDataApi; + @Resource + private TrendsApi trendsApi; + @Resource + private SerialNumberApi serialNumberApi; + @Resource + private Validator validator; + + @Resource + private BomService bomService; @Resource private ProductionMainMapper productionMainMapper; @Resource @@ -77,18 +127,34 @@ public class ProductionMainServiceImpl implements ProductionMainService { @Resource private WorkMainService workMainService; - - @Override + @Transactional public Long createProductionMain(ProductionMainCreateReqVO createReqVO) { // 插入 - ProductionMainDO productionMain = ProductionMainConvert.INSTANCE.convert(createReqVO); - productionMainMapper.insert(productionMain); + ProductionMainDO mainDO = ProductionMainConvert.INSTANCE.convert(createReqVO); + List subDOList = ProductionDetailConvert.INSTANCE.convertList03(createReqVO.getSubList()); + for (ProductionDetailDO detailDO : subDOList) { + this.validateProductionDetailCreate(mainDO, detailDO); + } + String number = serialNumberApi.generateCode(RuleCodeEnum.WORK_PLAN.getCode()); + mainDO.setNumber(number); + mainDO.setBusinessType("ProductReceipt"); // 业务类型:制品收货 + productionMainMapper.insert(mainDO); + for (ProductionDetailDO detailDO : subDOList) { + detailDO.setMasterId(mainDO.getId()); + detailDO.setNumber(number); + detailDO.setGoodQty(new BigDecimal(0.0)); + detailDO.setNotGoodQty(new BigDecimal(0.0)); + } + productionDetailMapper.insertBatch(subDOList); + //增加操作记录 + trendsApi.createTrends(mainDO.getId(), "productionMain", "增加了生产计划", TrendsTypeEnum.CREATE); // 返回 - return productionMain.getId(); + return mainDO.getId(); } @Override + @Transactional public void updateProductionMain(ProductionMainUpdateReqVO updateReqVO) { // 校验存在 validateProductionMainExists(updateReqVO.getId()); @@ -105,10 +171,12 @@ public class ProductionMainServiceImpl implements ProductionMainService { productionMainMapper.deleteById(id); } - private void validateProductionMainExists(Long id) { - if (productionMainMapper.selectById(id) == null) { + private ProductionMainDO validateProductionMainExists(Long id) { + ProductionMainDO existProductionMainDO = productionMainMapper.selectById(id); + if (existProductionMainDO == null) { throw exception(PRODUCTION_MAIN_NOT_EXISTS); } + return existProductionMainDO; } @Override @@ -163,135 +231,154 @@ public class ProductionMainServiceImpl implements ProductionMainService { } @Override + public List getProductionMainList(CustomConditions conditions) { + return productionMainMapper.selectSeniorList(conditions); + } + + /** + * 新增校验 + * @param detailDo + * @return + */ + private void validateProductionDetailCreate(ProductionMainDO mainDo, ProductionDetailDO detailDo) { + // 校验物品代码 + ItembasicDO itembasicDO = itembasicService.selectItembasic(detailDo.getItemCode()); + if (!itembasicDO.getUom().equals(detailDo.getUom())) { + throw exception(ITEMBASIC_UOM_EXCEPTION, dictDataApi.selectDictValue(detailDo.getUom()).getLabel(), dictDataApi.selectDictValue(itembasicDO.getUom()).getLabel()); + } + // 校验车间 基础信息 + workshopService.selectWorkshopExist(mainDo.getWorkshop()); + // 校验生产线基础信息 + productionlineService.productionLineCodeExist(mainDo.getProductionLine()); + // 校验班组基础信息 + teamService.selectTeamExist(mainDo.getTeam()); + // 校验班次基础信息 + shiftService.selectShiftExist(mainDo.getShift()); + // 校验生产线和物品关系 + productionlineitemService.productionLineCodeAndpItemCodeExist(mainDo.getProductionLine(), detailDo.getItemCode()); + // 校验物品和bom关系 + bomService.bomItemCodeAndVersionExist(detailDo.getItemCode(), detailDo.getBomVersion()); + } + + /** + * 主表校验导入 + * @param mainDo + * @return + */ + private String validateProductionMainImport(ProductionMainDO mainDo) { + StringBuilder message = new StringBuilder(); + try { + ValidationUtils.validate(validator, mainDo); + } catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + // 校验车间 基础信息 + try { + workshopService.selectWorkshopExist(mainDo.getWorkshop()); + } catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + // 校验生产线基础信息 + try { + productionlineService.productionLineCodeExist(mainDo.getProductionLine()); + } catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + // 校验班组基础信息 + try { + teamService.selectTeamExist(mainDo.getTeam()); + } catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + // 校验班次基础信息 + try { + shiftService.selectShiftExist(mainDo.getShift()); + } catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + return message.toString(); + } + + /** + * 子表校验导入 + * @param detailDo + * @return + */ + private String validateProductionDetailImport(ProductionMainDO mainDo, ProductionDetailDO detailDo) { + StringBuilder message = new StringBuilder(); + try { + ValidationUtils.validate(validator, detailDo); + } catch (Exception e) { + message.append(e.getMessage()).append(","); + } + // 校验物品代码 + try { + ItembasicDO itembasicDO = itembasicService.selectItembasic(detailDo.getItemCode()); + if (!dictDataApi.selectDictValue(itembasicDO.getUom()).getLabel().equals(detailDo.getUom())) { + message.append("计量单位【").append(detailDo.getUom()).append("】错误,应该是【").append(dictDataApi.selectDictValue(itembasicDO.getUom()).getLabel()).append("】").append(","); + } + } catch (Exception e) { + message.append(e.getMessage()).append(","); + } + // 校验生产线和物品关系 + try { + productionlineitemService.productionLineCodeAndpItemCodeExist(mainDo.getProductionLine(), detailDo.getItemCode()); + } catch (Exception e) { + message.append(e.getMessage()).append(","); + } + // 校验物品和bom关系 + try { + bomService.bomItemCodeAndVersionExist(detailDo.getItemCode(), detailDo.getBomVersion()); + } catch (Exception e) { + message.append(e.getMessage()).append(","); + } + return message.toString(); + } + + @Override + @Transactional public List importProductionMainList(List datas, Integer mode, boolean updatePart) { if (CollUtil.isEmpty(datas)) { throw exception(PURCHASECLAIM_REQUEST_IMPORT_LIST_IS_EMPTY); } List errorList = new ArrayList<>(); datas.forEach(createReqVO -> { - // 校验,判断是否有不符合的原因,并加入errorList,如果主表则所有子表都加入errorList - String messageMain = ""; - //主表的验证 - // 校验班组基础信息 - try { - if (!"".equals(createReqVO.getTeam())) { - TeamDO teamDO = teamService.selectTeamExist(createReqVO.getTeam()); - if (teamDO == null) { - messageMain += "班组" + createReqVO.getTeam() + "无效" + ","; - } - } - } catch (Exception ex) { - messageMain += ex.getMessage() + ","; - } - // 校验班次基础信息 - try { - if (!"".equals(createReqVO.getShift())) { - TeamDO teamDO = teamService.selectTeamExist(createReqVO.getTeam()); - if (teamDO == null) { - messageMain += "班组" + createReqVO.getTeam() + "无效" + ","; - } - } - } catch (Exception ex) { - messageMain += ex.getMessage() + ","; - } - - //子表的验证 + ProductionMainDO mainDO = ProductionMainConvert.INSTANCE.convert(createReqVO); + String messageMain = this.validateProductionMainImport(mainDO); List subList = createReqVO.getSubList(); List subDOList = ProductionDetailConvert.INSTANCE.convertList03(subList); - for (ProductionDetailDO purchasePlanDetailDO : subDOList) { - String messageDetail = ""; - // 校验物品基础信息 - try { - ItembasicDO itembasicDO = itembasicService.selectItembasic(purchasePlanDetailDO.getItemCode()); - if (itembasicDO.getUom() != purchasePlanDetailDO.getUom()) { - messageDetail += "计量单位" + itembasicDO.getUom() + "错误,应该是" + purchasePlanDetailDO.getUom() + ","; - } else { -// purchasePlanDetailDO.setItemDesc1(itembasicDO.getDesc1()); -// purchasePlanDetailDO.setItemDesc2(itembasicDO.getDesc2()); -// purchasePlanDetailDO.setItemName(itembasicDO.getName()); -// purchasePlanDetailDO.setProjectCode(itembasicDO.getProject()); - } - } catch (ServiceException ex) { - messageDetail += ex.getMessage() + ","; - } - //校验车间基础信息 - try { - workshopService.selectWorkshopExist(createReqVO.getWorkshop()); - } catch (Exception ex) { - messageMain += ex.getMessage() + ","; - } - // 校验生产线基础信息 - try { - ProductionlineDO productionlineDO = productionlineService.productionLineCodeExist(createReqVO.getProductionLine()); - if (productionlineDO != null) { - //prodlinedto.fg_location_code=to_location_code - } - } catch (Exception ex) { - messageMain += ex.getMessage() + ","; - } - - // 校验工位基础信息 -// try { -// if("".equals(work_station_code){ -// -// } -// } catch (Exception ex) { -// messageMain += ex.getMessage() + ","; -// } - - // 校验零件生产线关系 - try { -// productionlineitemService.productionLineCodeAndpItemCodeExist(createReqVO.getProductionLineCode(), purchasePlanDetailDO.getItemCode()); - } catch (Exception ex) { - messageMain += ex.getMessage() + ","; - } - - // 检验生产订单 - try { - workMainService.selectWorkExist(createReqVO.getNumber(),purchasePlanDetailDO.getItemCode()); - } catch (Exception ex) { - messageMain += ex.getMessage() + ","; - } - - ProductionDetailCreateReqVO purchasePlanDetailCreateReqVO = ProductionDetailConvert.INSTANCE.convert1(purchasePlanDetailDO); - ProductionMainImportErrorVO importVO = ProductionDetailConvert.INSTANCE.convert(createReqVO, purchasePlanDetailCreateReqVO); - //进行子表的错误统计 - //主表没有错误 写入库里 - if (!messageMain.equals("") || !messageDetail.equals("")) { - importVO.setImportStatus("失败"); + // 是否有错误数据 + boolean flag = true; + for (ProductionDetailDO detailDO : subDOList) { + String messageDetail = this.validateProductionDetailImport(mainDO, detailDO); + if (!messageMain.isEmpty() || !messageDetail.isEmpty()) { + ProductionMainImportErrorVO importErrorVO = ProductionMainConvert.INSTANCE.convert(createReqVO, detailDO); + importErrorVO.setImportStatus("失败"); messageMain = messageMain + messageDetail; - importVO.setImportRemark(messageMain.substring(0, messageMain.length() - 1)); - errorList.add(importVO); - } else { - purchasePlanDetailDO.setNumber(createReqVO.getNumber()); - purchasePlanDetailDO.setMasterId(createReqVO.getId()); - purchasePlanDetailDO.setGoodQty(new BigDecimal(0)); - purchasePlanDetailDO.setNotGoodQty(new BigDecimal(0)); + importErrorVO.setImportRemark(messageMain.substring(0, messageMain.length() - 1)); + errorList.add(importErrorVO); + flag = false; } } - - if (errorList.isEmpty()) { - ProductionMainDO existPurchaseclaimRequestMainDO = productionMainMapper.selectByNumber(createReqVO.getNumber()); - // 判断如果不存在,在进行插入 - if (existPurchaseclaimRequestMainDO == null && mode != 3) { - createReqVO.setStatus(DictFrameworkUtils.parseDictDataValue(DictTypeConstants.REQUEST_STATUS, "新增")); - BusinesstypeDO businesstypeDO = jobUtils.selectDocumentSettingFromBusinessType("WorkPlan"); - if (businesstypeDO != null) { - createReqVO.setBusinessType(businesstypeDO.getCode()); - } - - ProductionMainDO createObj = ProductionMainConvert.INSTANCE.convert(createReqVO); - productionMainMapper.insert(createObj); - productionDetailMapper.insertBatch(subDOList); - } else if (existPurchaseclaimRequestMainDO == null && mode != 2) { - BusinesstypeDO businesstypeDO = jobUtils.selectDocumentSettingFromBusinessType("WorkPlan"); - if (businesstypeDO != null) { - createReqVO.setBusinessType(businesstypeDO.getCode()); - } - ProductionMainDO createObj = ProductionMainConvert.INSTANCE.convert(createReqVO); - productionMainMapper.updateById(createObj); - productionDetailMapper.updateBatch(subDOList); + //写入数据 + if(flag) { + //申请单目前只做新增 + String number = serialNumberApi.generateCode(RuleCodeEnum.WORK_PLAN.getCode()); + mainDO.setNumber(number); + mainDO.setAvailable("TRUE"); // 导入默认 可用 + mainDO.setBusinessType("ProductReceipt"); // 业务类型:制品收货 + mainDO.setStatus("1"); // 默认新增状态 + productionMainMapper.insert(mainDO); + //增加操作记录 + trendsApi.createTrends(mainDO.getId(), "productionMain", "导入了生产计划", TrendsTypeEnum.CREATE); + for (ProductionDetailDO detailDO : subDOList) { + detailDO.setMasterId(mainDO.getId()); + detailDO.setNumber(number); + detailDO.setAvailable("TRUE"); // 导入默认 可用 + detailDO.setGoodQty(new BigDecimal(0.0)); + detailDO.setNotGoodQty(new BigDecimal(0.0)); } + productionDetailMapper.insertBatch(subDOList); } }); //错误不为空并非部分更新,手工回滚 @@ -301,4 +388,123 @@ public class ProductionMainServiceImpl implements ProductionMainService { return errorList; } + @Override + @Transactional + public Integer closeProductionMain(Long id) { + // 校验存在存在下级单据 + ProductionMainDO mainDO = validateProductionMainExists(id); + PlanStatusState planStatusState = new PlanStatusState(mainDO.getStatus()); + boolean flag = planStatusState.close(); + if(!flag) { + throw new ServiceException(PRODUCTION_MAIN_CANNOT_CLOSE); + } + mainDO.setStatus(planStatusState.getState().getCode()); + //增加操作记录 + trendsApi.createTrends(id, "productionMain", "关闭了生产计划", TrendsTypeEnum.UPDATE); + return productionMainMapper.updateById(mainDO); + } + + @Override + @Transactional + public Integer submitProductionMain(Long id) { + ProductionMainDO mainDO = validateProductionMainExists(id); + PlanStatusState planStatusState = new PlanStatusState(mainDO.getStatus()); + boolean flag = planStatusState.submit(); + if(!flag) { + throw new ServiceException(PRODUCTION_MAIN_CANNOT_SUBMIT); + } + mainDO.setStatus(planStatusState.getState().getCode()); + //增加操作记录 + trendsApi.createTrends(id, "productionMain", "提交了生产计划", TrendsTypeEnum.UPDATE); + return productionMainMapper.updateById(mainDO); + } + + @Override + public Integer openProductionMain(Long id) { + ProductionMainDO mainDO = validateProductionMainExists(id); + PlanStatusState planStatusState = new PlanStatusState(mainDO.getStatus()); + boolean flag = planStatusState.open(); + if(!flag) { + throw new ServiceException(PRODUCTION_MAIN_CANNOT_OPEN); + } + mainDO.setStatus(planStatusState.getState().getCode()); + //增加操作记录 + trendsApi.createTrends(id, "productionMain", "打开了生产计划", TrendsTypeEnum.UPDATE); + return productionMainMapper.updateById(mainDO); + } + + @Override + public Integer rejectProductionMain(Long id) { + ProductionMainDO mainDO = validateProductionMainExists(id); + PlanStatusState planStatusState = new PlanStatusState(mainDO.getStatus()); + boolean flag = planStatusState.reject(); + if(!flag) { + throw new ServiceException(PRODUCTION_MAIN_CANNOT_REJECT); + } + mainDO.setStatus(planStatusState.getState().getCode()); + //增加操作记录 + trendsApi.createTrends(id, "productionMain", "驳回了生产计划", TrendsTypeEnum.UPDATE); + return productionMainMapper.updateById(mainDO); + } + + @Override + public Integer agreeProductionMain(Long id) { + ProductionMainDO mainDO = validateProductionMainExists(id); + PlanStatusState planStatusState = new PlanStatusState(mainDO.getStatus()); + boolean flag = planStatusState.agree(); + if(!flag) { + throw new ServiceException(PRODUCTION_MAIN_CANNOT_AGREE); + } + mainDO.setStatus(planStatusState.getState().getCode()); + //增加操作记录 + trendsApi.createTrends(id, "productionMain", "审批通过了生产计划", TrendsTypeEnum.UPDATE); + return productionMainMapper.updateById(mainDO); + } + + @Override + public Integer publishProductionMain(Long id) { + ProductionMainDO mainDO = validateProductionMainExists(id); + PlanStatusState planStatusState = new PlanStatusState(mainDO.getStatus()); + boolean flag = planStatusState.publish(); + if(!flag) { + throw new ServiceException(PRODUCTION_MAIN_CANNOT_PUBLISH); + } + mainDO.setStatus(planStatusState.getState().getCode()); + // 生成申请单据 + this.generateRequest(mainDO, productionDetailMapper.selectList(mainDO.getId())); + //增加操作记录 + trendsApi.createTrends(id, "productionMain", "发布了生产计划", TrendsTypeEnum.UPDATE); + return productionMainMapper.updateById(mainDO); + } + + @Override + public Integer resettingProductionMain(Long id) { + ProductionMainDO mainDO = validateProductionMainExists(id); + PlanStatusState planStatusState = new PlanStatusState(mainDO.getStatus()); + boolean flag = planStatusState.resetting(); + if(!flag) { + throw new ServiceException(PRODUCTION_MAIN_CANNOT_RESETTING); + } + mainDO.setStatus(planStatusState.getState().getCode()); + //增加操作记录 + trendsApi.createTrends(id, "productionMain", "重置了生产计划", TrendsTypeEnum.UPDATE); + return productionMainMapper.updateById(mainDO); + } + + /** + * 生成申请单据 + * @param mainDO + * @param detailDOList + */ + private void generateRequest(ProductionMainDO mainDO, List detailDOList ) { + // 判断单据设置:该计划发布后 是否创建 备料计划 + if(switchMapper.selectByCode("CreatePrepareToIssuePlanAfterProductionPlanPublished").getEffectiveSetValue().equals("TRUE")) { +// TODO:先做备料计划导入新增编辑 之后再补充这里 + } + // 判断单据设置:该计划发布后 是否创建 制品收货申请 + if(switchMapper.selectByCode("CreateProductReciptRequestAfterProductionPlanPublished").getEffectiveSetValue().equals("TRUE")) { +// TODO:先做制品收货申请导入新增编辑 之后再补充这里 + } + } + }