From 9313ac3c2db94c86bb4b809161b808e9ec2d57bf Mon Sep 17 00:00:00 2001 From: hongchao <3228015117@qq.com> Date: Fri, 10 Jan 2025 08:57:49 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E4=BB=B6=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biz/constant/MaterialConstants.java | 3 + .../common/biz/enums/TmTaskTypeEnum.java | 3 +- .../part/controller/partAcceptController.java | 98 ++++++ .../controller/partArrivedController.java | 153 ++++++++++ .../part/domain/PartTypeCheckDetails.java | 178 +++++++++++ .../part/domain/PartTypeCheckDto.java | 31 ++ .../part/domain/PartTypeCheckInfo.java | 138 +++++++++ .../material/part/domain/PartTypeDto.java | 112 +++++++ .../part/domain/PartTypeQueryDto.java | 88 ++++++ .../part/mapper/PartAcceptMapper.java | 86 ++++++ .../part/mapper/PartArrivedMapper.java | 95 ++++++ .../part/service/IPartAcceptService.java | 53 ++++ .../part/service/IPartArrivedService.java | 70 +++++ .../service/impl/PartAcceptServiceImpl.java | 142 +++++++++ .../service/impl/PartArrivedServiceImpl.java | 281 ++++++++++++++++++ .../service/impl/ScrapReasonServiceImpl.java | 6 +- .../mapper/material/part/PartAcceptMapper.xml | 74 +++++ .../material/part/PartArrivedMapper.xml | 171 +++++++++++ 18 files changed, 1778 insertions(+), 4 deletions(-) create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/part/controller/partAcceptController.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/part/controller/partArrivedController.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeCheckDetails.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeCheckDto.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeCheckInfo.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeDto.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeQueryDto.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/part/mapper/PartAcceptMapper.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/part/mapper/PartArrivedMapper.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/IPartAcceptService.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/IPartArrivedService.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/impl/PartAcceptServiceImpl.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/impl/PartArrivedServiceImpl.java create mode 100644 bonus-modules/bonus-material/src/main/resources/mapper/material/part/PartAcceptMapper.xml create mode 100644 bonus-modules/bonus-material/src/main/resources/mapper/material/part/PartArrivedMapper.xml diff --git a/bonus-common-biz/src/main/java/com/bonus/common/biz/constant/MaterialConstants.java b/bonus-common-biz/src/main/java/com/bonus/common/biz/constant/MaterialConstants.java index 35c0aee3..72f2a55d 100644 --- a/bonus-common-biz/src/main/java/com/bonus/common/biz/constant/MaterialConstants.java +++ b/bonus-common-biz/src/main/java/com/bonus/common/biz/constant/MaterialConstants.java @@ -67,6 +67,9 @@ public class MaterialConstants { /** 修饰入库单号的开头字母 */ public static final String REPAIR_INPUT_TASK_TYPE_LABEL = "R"; + /** 配件新购号的开头字母 */ + public final static String PART_TASK_TYPE_LABEL = "PJXG"; + /** * 内部单位协议 */ diff --git a/bonus-common-biz/src/main/java/com/bonus/common/biz/enums/TmTaskTypeEnum.java b/bonus-common-biz/src/main/java/com/bonus/common/biz/enums/TmTaskTypeEnum.java index e03d42ff..21dcbbd3 100644 --- a/bonus-common-biz/src/main/java/com/bonus/common/biz/enums/TmTaskTypeEnum.java +++ b/bonus-common-biz/src/main/java/com/bonus/common/biz/enums/TmTaskTypeEnum.java @@ -17,7 +17,8 @@ public enum TmTaskTypeEnum { TM_TASK_FACTORY_MANAGEMENT(9, "物资厂家管理任务"), TM_TASK_AGREEMENT_MANAGEMENT(10, "新增协议任务"), TM_TASK_REPAIR_INPUT(11, "修饰后入库任务"), - TM_TASK_PART_LEASE(12, "配件领料任务"); + TM_TASK_PART_LEASE(12, "配件领料任务"), + TM_TASK_PART_TYPE(13, "配件新购"); private final Integer taskTypeId; private final String taskTypeName; diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/controller/partAcceptController.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/controller/partAcceptController.java new file mode 100644 index 00000000..1d2908bc --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/controller/partAcceptController.java @@ -0,0 +1,98 @@ +package com.bonus.material.part.controller; + + +import com.bonus.common.biz.annotation.StoreLog; +import com.bonus.common.biz.domain.purchase.PurchaseDto; +import com.bonus.common.core.web.controller.BaseController; +import com.bonus.common.core.web.domain.AjaxResult; + +import com.bonus.material.common.annotation.PreventRepeatSubmit; +import com.bonus.material.ma.domain.TypeKeeper; +import com.bonus.material.part.domain.PartTypeCheckDetails; +import com.bonus.material.part.domain.PartTypeCheckInfo; +import com.bonus.material.part.domain.PartTypeDto; + +import com.bonus.material.part.service.IPartAcceptService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + + +import java.util.List; + + + +/** + * 配件入库管理Controller + * + * @author hongchao + * @date 2025-01-09 + */ +@Api(tags = "配件入库管理接口") +@RestController +@RequestMapping("/part_accept") +public class partAcceptController extends BaseController { + + @Autowired + private IPartAcceptService partAcceptService; + + /** + * 获取配件入库类型下拉框 + */ + @ApiOperation(value = "获取配件入库类型下拉框") +// @RequiresPermissions("scrap:details:list") + @GetMapping("/partTypeThree") + public AjaxResult partTypeThree(PartTypeDto partTypeDto) { + return partAcceptService.getTypeTree(partTypeDto); + } + + /** + * 入库 + * @param partTypeCheckDetails + * @return + */ + @ApiOperation(value = "入库操作") +// @RequiresPermissions("purchase:storage:add") + @PostMapping("/partTypeWarehouse") + public AjaxResult partTypeWarehouse(@RequestBody List partTypeCheckDetails) { + return partAcceptService.partTypeWarehouse(partTypeCheckDetails); + } + + /** + * 驳回 + * @param partTypeCheckDetails + * @return + */ + @ApiOperation(value = "驳回操作") +// @RequiresPermissions("purchase:storage:add") + @PostMapping("/partTypeReject") + public AjaxResult partTypeReject(@RequestBody List partTypeCheckDetails) { + return partAcceptService.partTypeReject(partTypeCheckDetails); + } + + /** + * 外层入库 + * @param partTypeCheckInfo + * @return + */ + @ApiOperation(value = "入库操作") +// @RequiresPermissions("purchase:storage:add") + @PostMapping("/passAll") + public AjaxResult passAll(@RequestBody List partTypeCheckInfo) { + return partAcceptService.passAll(partTypeCheckInfo); + } + + /** + * 外层驳回 + * @param partTypeCheckInfo + * @return + */ + @ApiOperation(value = "入库操作") +// @RequiresPermissions("purchase:storage:add") + @PostMapping("/rejectAll") + public AjaxResult rejectAll(@RequestBody List partTypeCheckInfo) { + return partAcceptService.rejectAll(partTypeCheckInfo); + } +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/controller/partArrivedController.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/controller/partArrivedController.java new file mode 100644 index 00000000..debb6794 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/controller/partArrivedController.java @@ -0,0 +1,153 @@ +package com.bonus.material.part.controller; + +import cn.hutool.core.convert.Convert; +import com.bonus.common.biz.config.ListPagingUtil; +import com.bonus.common.core.utils.ServletUtils; +import com.bonus.common.core.utils.poi.ExcelUtil; +import com.bonus.common.core.web.controller.BaseController; +import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.common.log.annotation.SysLog; +import com.bonus.common.log.enums.OperaType; +import com.bonus.material.common.annotation.PreventRepeatSubmit; +import com.bonus.material.part.domain.*; +import com.bonus.material.part.mapper.PartArrivedMapper; +import com.bonus.material.part.service.IPartArrivedService; +import com.bonus.material.purchase.domain.PurchaseCheckDetails; +import com.bonus.material.purchase.domain.PurchaseCheckInfo; +import com.bonus.material.purchase.domain.dto.PurchaseCheckDto; +import com.bonus.material.purchase.domain.dto.PurchaseQueryDto; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.util.List; + +import static com.bonus.common.core.web.page.TableSupport.PAGE_NUM; +import static com.bonus.common.core.web.page.TableSupport.PAGE_SIZE; + +/** + * 配件新购管理Controller + * + * @author hongchao + * @date 2025-01-08 + */ +@Api(tags = "配件新购管理接口") +@RestController +@RequestMapping("/part_arrived") +public class partArrivedController extends BaseController { + + @Autowired + private IPartArrivedService partArrivedService; + + @Autowired + private PartArrivedMapper partArrivedMapper; + + /** + * 获取配件新购类型树结构 + */ + @ApiOperation(value = "获取配件新购类型树结构") +// @RequiresPermissions("scrap:details:list") + @GetMapping("/typeTree") + public AjaxResult getTypeTree(@RequestParam(required = false) Long partId, @RequestParam(required = false) String partName) { + List listByMaType = partArrivedService.getTypeTree(partId, partName); + return success(listByMaType); + } + + /** + * 新增新购验收任务 + */ + @ApiOperation("新增新购验收任务") + @PreventRepeatSubmit + //@RequiresPermissions("purchase:info:add") + @SysLog(title = "新购验收任务", businessType = OperaType.INSERT, module = "配件新购->新增新购验收任务") + @PostMapping + public AjaxResult add(@Valid @NotNull @RequestBody PartTypeCheckDto partTypeCheckDto) { + try { + return partArrivedService.insertPartTypeCheckInfo(partTypeCheckDto); + } catch (final Exception e) { + return error("系统错误, " + e.getMessage()); + } + } + + /** + * 查询新购验收任务列表 + */ + @ApiOperation("查询新购验收任务列表") + //@RequiresPermissions("purchase:info:list") + @GetMapping("/list") + public AjaxResult list(PartTypeQueryDto partTypeQueryDto) { + final List list = partArrivedService.selectPartTypeCheckInfoList(partTypeQueryDto); + final Integer pageIndex = Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1); + final Integer pageSize = Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10); + return AjaxResult.success(ListPagingUtil.paging(pageIndex, pageSize, list)); + } + + /** + * 获取新购验收任务详细信息 + */ + @ApiOperation("获取新购验收任务详细信息") + //@RequiresPermissions("purchase:info:query") + @GetMapping(value = "/getInfo") + public AjaxResult getInfo(@NotNull(message = "请求对象不能为空") PartTypeQueryDto partTypeQueryDto) { + return success(partArrivedService.selectPartTypeCheckInfoById(partTypeQueryDto)); + } + + /** + * 修改新购验收任务 + */ + @ApiOperation("修改新购验收任务") + @PreventRepeatSubmit + //@RequiresPermissions("purchase:info:edit") + @SysLog(title = "新购验收任务", businessType = OperaType.UPDATE, module = "配件新购->修改新购验收任务") + @PutMapping + public AjaxResult edit(@RequestBody @NotNull(message = "请求参数不能为空") @Valid PartTypeCheckDto partTypeCheckDto) { + try { + return toAjax(partArrivedService.updatePartTypeCheckInfo(partTypeCheckDto)); + } catch (final Exception e) { + return error("系统错误, " + e.getMessage()); + } + } + + /** + * 导出配件新购任务列表 + */ + @ApiOperation("导出配件新购任务列表") + @PreventRepeatSubmit + //@RequiresPermissions("purchase:info:export") + @SysLog(title = "配件新购任务", businessType = OperaType.EXPORT, module = "配件新购->导出配件新购任务") + @PostMapping("/export") + public void export(HttpServletResponse response, PartTypeQueryDto partTypeQueryDto) { + List list = partArrivedService.selectPartTypeCheckInfoList(partTypeQueryDto); + ExcelUtil util = new ExcelUtil<>(PartTypeCheckInfo.class); + util.exportExcel(response, list, "配件新购任务数据"); + } + + /** + * 导出配件新购任务详细列表 + */ + @ApiOperation("导出配件新购任务详细列表") + @PreventRepeatSubmit + //@RequiresPermissions("purchase:info:export") + @SysLog(title = "配件新购任务详细", businessType = OperaType.EXPORT, logType = 1,module = "配件新购->导出配件新购任务详细") + @PostMapping("/exportDetails") + public void exportDetails(HttpServletResponse response, PartTypeQueryDto partTypeQueryDto) { + List list = partArrivedMapper.selectPartTypeCheckDetailsListByQueryDto(partTypeQueryDto); + ExcelUtil util = new ExcelUtil<>(PartTypeCheckDetails.class); + util.exportExcel(response, list, "配件新购任务详细数据"); + } + + /** + * 删除配件新购任务 + */ + @ApiOperation("删除配件新购任务") + //@RequiresPermissions("purchase:info:remove") + @PostMapping("/delete") + public AjaxResult deletePartInfo(@RequestBody PartTypeQueryDto partTypeQueryDto) { + return toAjax(partArrivedService.deletePartInfo(partTypeQueryDto)); + } + +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeCheckDetails.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeCheckDetails.java new file mode 100644 index 00000000..5b791970 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeCheckDetails.java @@ -0,0 +1,178 @@ +package com.bonus.material.part.domain; + +import com.bonus.common.core.annotation.Excel; +import com.bonus.common.core.web.domain.BaseEntity; +import com.bonus.material.basic.domain.BmFileInfo; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 新购验收任务详细对象 purchase_check_details + * @author xsheng + */ +@EqualsAndHashCode(callSuper = false) +@Data +@ToString +@Accessors(chain = true) +public class PartTypeCheckDetails extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** 主键id */ + private Long id; + + /** 任务ID */ + //@Excel(name = "任务ID") + @ApiModelProperty(value = "任务ID") + private Long taskId; + + /** 规格id */ + //@Excel(name = "规格id") + @ApiModelProperty(value = "规格id") + private Long partId; + + @Excel(name = "规格名称", sort = 3) + @ApiModelProperty(value = "规格名称") + private String partName; + + @ApiModelProperty(value = "机具编号") + private String maCode; + + @ApiModelProperty(value = "单位名称") + private String unitName; + + @ApiModelProperty(value = "数值") + private String unitValue; + + @Excel(name = "配件名称", sort = 2) + @ApiModelProperty(value = "物资名称--规格parent类型") + private String maTypeName; + + @Excel(name = "配件类型", sort = 1) + @ApiModelProperty(value = "配件类型--规格parent类型") + private String maName; + + /** 采购单价(不含税) */ + @Excel(name = "购置单价(不含税)", sort = 6) + @ApiModelProperty(value = "采购单价(不含税)") + private BigDecimal purchasePrice; + + /** 采购单价(含税) */ + @Excel(name = "购置单价(含税)", sort = 5) + @ApiModelProperty(value = "采购单价(含税)") + private BigDecimal purchaseTaxPrice; + + /** 采购数量 */ + @Excel(name = "采购数量", sort = 4) + @ApiModelProperty(value = "采购数量") + private BigDecimal purchaseNum; + + /** 验收数量 */ + @ApiModelProperty(value = "验收数量") + private BigDecimal checkNum; + + /** 绑定数量 */ + @ApiModelProperty(value = "绑定数量") + private BigDecimal bindNum; + + /** 验收结论 */ + //@Excel(name = "验收结论") + @ApiModelProperty(value = "验收结论") + private String checkResult; + + /** 质保材料 */ + @ApiModelProperty(value = "质保材料") + private String warnDocuments; + + /** 原因 */ + @ApiModelProperty(value = "原因") + private String reason; + + /** 物资厂家id */ + //@Excel(name = "物资厂家id") + @ApiModelProperty(value = "物资厂家id") + private Long supplierId; + + /** 物资厂家名称 */ + @ApiModelProperty(value = "物资厂家名称") + //@Excel(name = "物资厂家名称") + private String supplierName; + + /** 状态,参考数据字典purchase_task_status键值 */ + @Excel(name = "状态", readConverterExp = "0=待验收,1=已入库,2=已驳回", sort = 8) + @ApiModelProperty(value = "状态,参考数据字典purchase_task_status键值") + private Integer status; + + /** 出厂日期 */ + @ApiModelProperty(value = "出厂日期") + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "出厂日期", width = 30, dateFormat = "yyyy-MM-dd", sort = 7) + private Date productionTime; + + /** 验收图片 */ + //@Excel(name = "验收图片") + @ApiModelProperty(value = "验收图片") + private String checkUrlName; + + /** 验收图片名称 */ + //@Excel(name = "验收图片名称") + @ApiModelProperty(value = "验收图片名称") + private String checkUrl; + + /** 入库数量 */ + @ApiModelProperty(value = "入库数量") + private BigDecimal inputNum; + + /** 是否入库 */ + @ApiModelProperty(value = "是否入库") + private String inputStatus; + + /** 入库时间 */ + @ApiModelProperty(value = "入库时间") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date inputTime; + + /** 验收附件名称 */ + //@Excel(name = "验收附件名称") + @ApiModelProperty(value = "验收附件名称") + private String fileName; + + /** 验收附件 */ + //@Excel(name = "验收附件") + @ApiModelProperty(value = "验收附件") + private String fileUrl; + + /** 数据所属组织 */ + //@Excel(name = "数据所属组织") + @ApiModelProperty(value = "数据所属组织") + private Long companyId; + + /** 是否是固定资产编号(0 否,1 是) */ + @ApiModelProperty(value = "是否是固定资产编号(0 否,1 是)") + private String fixCode; + + /** 管理方式(0编号 1计数) */ + @ApiModelProperty(value = "管理方式(0编号 1计数)") + private Integer manageType; + + /** 验收附件列表 */ + //@Excel(name = "验收附件列表") + @ApiModelProperty(value = "验收附件列表") + private List bmFileInfos; + + /** 是否有附件 */ + @ApiModelProperty(value = "是否有附件 0 是, 1 否") + private Integer isExitFile; + + /** 租赁价格 */ + @ApiModelProperty(value = "租赁价格") + private BigDecimal rentPrice; +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeCheckDto.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeCheckDto.java new file mode 100644 index 00000000..7b7344cd --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeCheckDto.java @@ -0,0 +1,31 @@ +package com.bonus.material.part.domain; + +import com.bonus.material.part.domain.PartTypeCheckDetails; +import com.bonus.material.part.domain.PartTypeCheckInfo; +import com.bonus.material.purchase.domain.PurchaseCheckDetails; +import com.bonus.material.purchase.domain.PurchaseCheckInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + + +@Data +public class PartTypeCheckDto { + + /** + * 采购验收任务info + */ + @ApiModelProperty(value = "采购验收任务info") + @NotNull(message = "采购验收任务info对象不能为空") + private PartTypeCheckInfo partTypeCheckInfo; + + /** + * 采购验收任务详情集合 + */ + @ApiModelProperty(value = "采购验收任务详情集合") + private List partTypeCheckDetailsList; + +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeCheckInfo.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeCheckInfo.java new file mode 100644 index 00000000..f09fb256 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeCheckInfo.java @@ -0,0 +1,138 @@ +package com.bonus.material.part.domain; + +import com.bonus.common.core.annotation.Excel; +import com.bonus.common.core.web.domain.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 新购验收任务对象 purchase_check_info + * @author syruan + */ +@EqualsAndHashCode(callSuper = false) +@Data +@ToString +public class PartTypeCheckInfo extends BaseEntity { + + private static final long serialVersionUID = 1335730477657434485L; + + /** 主键id */ + private Long id; + + /** 任务ID */ + //@Excel(name = "任务ID") + @ApiModelProperty(value = "任务ID") + private Long taskId; + + @ApiModelProperty(value = "任务状态") + private Integer taskStatus; + + @Excel(name = "状态", sort = 8) + @ApiModelProperty(value = "任务状态名称,未完成/已完成") + private String taskStatusName; + + @Excel(name = "采购单号", sort = 1) + @ApiModelProperty(value = "采购单号") + private String code; + + /** 采购日期 */ + @ApiModelProperty(value = "采购日期") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date purchaseTime; + + /** 到货日期 */ + @ApiModelProperty(value = "到货日期") + @NotNull(message = "到货日期不能为空") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "到货时间", width = 30, dateFormat = "yyyy-MM-dd", sort = 1) + private Date arrivalTime; + + /** 采购员 */ + //@Excel(name = "采购员") + @ApiModelProperty(value = "采购员") + private Long purchaser; + + /** 物资厂家id */ + //@Excel(name = "物资厂家id") + @ApiModelProperty(value = "物资厂家id") + private Long supplierId; + + /** 物资厂家名称 */ + @Excel(name = "物资厂家", sort = 7) + @ApiModelProperty(value = "物资厂家名称") + private String supplier; + + /** 数据所属组织 */ + //@Excel(name = "数据所属组织") + private Long companyId; + + /** + * 采购物资 + */ + @Excel(name = "采购物资", sort = 2) + @ApiModelProperty(value = "采购物资--外层Table字段") + private String purchaseMaTypeName; + + /** + * 采购数量 + */ + @Excel(name = "采购数量", sort = 3) + @ApiModelProperty(value = "采购数量--外层Table字段") + private BigDecimal purchaseMaNumber; + + /** + * 验收数量 + */ + @ApiModelProperty(value = "验收数量--外层Table字段") + private BigDecimal checkMaNumber; + + /** + * 绑定数量 + */ + @ApiModelProperty(value = "绑定数量--外层Table字段") + private BigDecimal bindMaNumber; + + @ApiModelProperty(value = "入库数量--外层Table字段") + private BigDecimal inputMaNumber; + + @ApiModelProperty(value = "待入库数量--外层Table字段") + private BigDecimal waitInputNumber; + + /** + * 采购单价(不含税) + */ + @Excel(name = "采购单价(不含税)", sort = 5) + @ApiModelProperty(value = "采购单价(不含税)--外层Table字段") + private BigDecimal purchasePrice; + + /** + * 采购单价(含税) + */ + @Excel(name = "采购单价(含税)", sort = 4) + @ApiModelProperty(value = "采购单价(含税)--外层Table字段") + private BigDecimal purchaseTaxPrice; + + /** + * 税率 + */ + @Excel(name = "税率", sort = 6) + @ApiModelProperty(value = "税率 0~100") + @Size(max = 100, message = "税率长度必须介于 0 和 100 之间") + private BigDecimal taxRate; + + //@Excel(name = "购买人", sort = 9) + @ApiModelProperty(value = "购买人名称") + private String purchaseName; + + @ApiModelProperty(value = "新购模块阶段名称") + private String modelName; + +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeDto.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeDto.java new file mode 100644 index 00000000..74f9a064 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeDto.java @@ -0,0 +1,112 @@ +package com.bonus.material.part.domain; + +import com.bonus.common.core.annotation.Excel; +import com.bonus.common.core.web.domain.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 配件类型对象 ma_part_type + * @author hongchao + */ +@EqualsAndHashCode(callSuper = false) +@Data +@ToString +public class PartTypeDto extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** 类型ID */ + @ApiModelProperty(value = "类型ID") + private Long partId; + + @NotBlank(message = "名称不能为空") + @Size(max=30, message = "名称长度不能超过30") + private String partName; + + + /** 上级ID */ + @ApiModelProperty(value = "上级ID") + private Long parentId; + + /** 实时库存 */ + @Excel(name = "实时库存") + @ApiModelProperty(value = "实时库存") + private BigDecimal storageNum; + + /** 类型编号 */ + @ApiModelProperty(value = "类型编号") + private String typeCode; + + /** 规格编号 */ + @ApiModelProperty(value = "规格编号") + private String modelCode; + + /** 计量单位ID */ + @ApiModelProperty(value = "计量单位ID") + private Long unitId; + + /** 计量单位名称 */ + @ApiModelProperty(value = "计量单位名称") + @Excel(name = "计量单位") + private String unitName; + + + /** 排序 */ + @ApiModelProperty(value = "排序") + @Excel(name = "排序") + private int sortNum; + + + /** 租赁费用生效时间 */ + @ApiModelProperty(value = "租赁费用生效时间") + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "租赁费用生效时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date effTime; + + /** 租赁单价 */ + @Excel(name = "租赁单价") + @ApiModelProperty(value = "租赁单价") + private BigDecimal rentPrice; + + /** 采购价原值 */ + @Excel(name = "采购价原值") + @ApiModelProperty(value = "采购价原值") + private BigDecimal buyPrice; + + + /** 税率 */ + @ApiModelProperty(value = "税率") + private BigDecimal taxRatio; + + /** 层级 */ + @ApiModelProperty(value = "层级") + private String level; + + + /** 库存预警数量 */ + @Excel(name = "库存预警数量") + @ApiModelProperty(value = "库存预警数量") + private Long warnNum; + + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + private String keyword; + + /** 子节点 */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private List children = new ArrayList<>(); + +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeQueryDto.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeQueryDto.java new file mode 100644 index 00000000..77c50c30 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/domain/PartTypeQueryDto.java @@ -0,0 +1,88 @@ +package com.bonus.material.part.domain; + +import com.bonus.common.core.annotation.Excel; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + + +@Data +public class PartTypeQueryDto { + + private Long id; + + @ApiModelProperty(value = "任务id") + private Long taskId; + + @ApiModelProperty(value = "登录用户id") + private Long userId; + + @ApiModelProperty(value = "任务单号") + private String code; + + @ApiModelProperty(value = "任务阶段,对应新购阶段枚举") + private Integer taskStage; + + @ApiModelProperty(value = "是否完成") + private Integer isFinish; + + @ApiModelProperty(value = "开始时间") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date startTime; + + @ApiModelProperty(value = "结束时间") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date endTime; + + @ApiModelProperty(value = "外层任务状态") + private Integer taskStatus; + + @ApiModelProperty(value = "关键字") + private String keyWord; + + @ApiModelProperty(value = "规格ID") + private Long partId; + + @ApiModelProperty(value = "物资厂家ID") + private Long supplierId; + + @ApiModelProperty(value = "出场日期") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date productionTime; + + /** 采购日期 */ + @ApiModelProperty(value = "采购日期") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date purchaseTime; + + /** 到货日期 */ + @ApiModelProperty(value = "到货日期") + @NotNull(message = "到货日期不能为空") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "到货日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date arrivalTime; + + /** 采购员 */ + @Excel(name = "采购员") + @ApiModelProperty(value = "采购员") + private Long purchaser; + + /** + * 税率 + */ + @ApiModelProperty(value = "税率 0~100") + @Size(max = 100, message = "税率长度必须介于 0 和 100 之间") + private BigDecimal taxRate; + + /** + * 子任务状态列表, 比如待验收:0 已入库:1 已驳回:2, + */ + @ApiModelProperty(value = "子任务状态列表") + private List statusList; +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/mapper/PartAcceptMapper.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/mapper/PartAcceptMapper.java new file mode 100644 index 00000000..f6a244c4 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/mapper/PartAcceptMapper.java @@ -0,0 +1,86 @@ +package com.bonus.material.part.mapper; + +import com.bonus.material.ma.domain.Type; +import com.bonus.material.part.domain.PartTypeCheckDetails; +import com.bonus.material.part.domain.PartTypeCheckInfo; +import com.bonus.material.part.domain.PartTypeDto; +import com.bonus.material.part.domain.PartTypeQueryDto; +import com.bonus.material.task.domain.TmTask; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 配件入库管理Mapper接口 + * + * @author hongchao + * @date 2024-01-09 + */ +public interface PartAcceptMapper +{ + + /** + * 查询配件类型三级树 + * + * @param partTypeDto 查询配件类型三级树 + * @return 查询配件类型三级树 + */ + List getTypeTree(PartTypeDto partTypeDto); + + /** + * 查询库存数量 + * @param id + * @return + */ + int getStorageNum(@Param("id") Long id); + + /** + * 入库 + * @param partTypeCheckDetail + * @return + */ + int partTypeWarehouse(PartTypeCheckDetails partTypeCheckDetail); + + /** + * 修改库存 + * @param partTypeCheckDetail + * @return + */ + int updatePartTypeStorage(PartTypeCheckDetails partTypeCheckDetail); + + /** + * 驳回 + * @param partTypeCheckDetail + * @return + */ + int partTypeReject(PartTypeCheckDetails partTypeCheckDetail); + + /** + * 获取待验收的数量 + * @param taskId + * @return + */ + int selectStatus(Long taskId); + + /** + * 修改任务状态未已完成 + * @param taskId + * @return + */ + void updateStatus(Long taskId); + + + /** + * 外层入库 + * @param taskId + * @return + */ + int passAll(Long taskId); + + /** + * 外层驳回 + * @param taskId + * @return + */ + int rejectAll(Long taskId); +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/mapper/PartArrivedMapper.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/mapper/PartArrivedMapper.java new file mode 100644 index 00000000..5c9352ec --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/mapper/PartArrivedMapper.java @@ -0,0 +1,95 @@ +package com.bonus.material.part.mapper; + +import com.bonus.material.ma.domain.Type; +import com.bonus.material.part.domain.PartTypeCheckDetails; +import com.bonus.material.part.domain.PartTypeCheckInfo; +import com.bonus.material.part.domain.PartTypeDto; +import com.bonus.material.part.domain.PartTypeQueryDto; +import com.bonus.material.purchase.domain.PurchaseCheckDetails; +import com.bonus.material.purchase.domain.PurchaseCheckInfo; +import com.bonus.material.purchase.domain.dto.PurchaseQueryDto; +import com.bonus.material.task.domain.TmTask; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 配件新购管理Mapper接口 + * + * @author hongchao + * @date 2024-01-08 + */ +public interface PartArrivedMapper +{ + + /** + * 查询配件类型三级树 + * + * @param partName 查询配件类型三级树 + * @return 查询配件类型三级树 + */ + List getTypeTree(String partName); + + /** + * 查询当年当月最大任务序号,用于生成任务编号 by 分类型查询 + * @param year 年 + * @param month 月 + * @param taskType 任务类型(字典表中获取,例如新购是:16) + */ + int getMonthMaxOrderByDate(@Param("year") String year, @Param("month") String month, @Param("taskType") Integer taskType); + + /** + * 新增任务 + * + * @param tmTask 任务 + * @return 结果 + */ + int insertTmTask(TmTask tmTask); + + /** + * 新增新购验收任务 + * + * @param partTypeCheckInfo 新购验收任务 + * @return 结果 + */ + int insertPartTypeCheckInfo(PartTypeCheckInfo partTypeCheckInfo); + + /** + * 批量新增新购验收任务详细 + * @param partTypeCheckDetailsList 新购验收任务详细集合 + */ + int insertPartTypeCheckDetailsList(List partTypeCheckDetailsList); + + /** + * 查询新购验收任务列表--多表关联查询 + * + * @param partTypeQueryDto 新购验收任务 + * @return 新购验收任务集合 + */ + List selectPartTypeCheckInfoJoinList(PartTypeQueryDto partTypeQueryDto); + + /** + * 查询新购验收任务详细列表 + * + * @param taskId 新购验收任务主键 + * @return 新购验收任务详细集合 + */ + List selectPartTypeCheckDetailsList(Long taskId); + + List selectPartTypeCheckDetailsListByQueryDto(PartTypeQueryDto partTypeQueryDto); + + PartTypeCheckInfo selectPartTypeCheckInfoById(Long id); + + int deletePartTypeCheckDetailsByParentIds(Long taskId); + + int deleteTmTask(Long taskId); + + /** + * 删除新购验收任务 + * + * @param id 需要删除的数据主键集合 + * @return 结果 + */ + int deletePartTypCheckInfoById(Long id); + +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/IPartAcceptService.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/IPartAcceptService.java new file mode 100644 index 00000000..bf2f7b2a --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/IPartAcceptService.java @@ -0,0 +1,53 @@ +package com.bonus.material.part.service; + +import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.material.part.domain.*; + +import java.util.List; + +/** + * 配件入库管理Service接口 + * + * @author hongchao + * @date 2025-01-09 + */ +public interface IPartAcceptService { + + /** + * 获取配件入库类型下拉框 + * + * @param partTypeDto 配件入库管理 + * @return 配件入库管理集合 + */ + + AjaxResult getTypeTree(PartTypeDto partTypeDto); + + /** + * 入库 + * @param partTypeCheckDetails + * @return + */ + AjaxResult partTypeWarehouse(List partTypeCheckDetails); + + /** + * 驳回 + * @param partTypeCheckDetails + * @return + */ + AjaxResult partTypeReject(List partTypeCheckDetails); + + + /** + * 外层入库 + * @param partTypeCheckInfo + * @return + */ + AjaxResult passAll(List partTypeCheckInfo); + + /** + * 外层驳回 + * @param partTypeCheckInfo + * @return + */ + AjaxResult rejectAll(List partTypeCheckInfo); +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/IPartArrivedService.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/IPartArrivedService.java new file mode 100644 index 00000000..f72b2625 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/IPartArrivedService.java @@ -0,0 +1,70 @@ +package com.bonus.material.part.service; + +import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.material.part.domain.PartTypeCheckDto; +import com.bonus.material.part.domain.PartTypeCheckInfo; +import com.bonus.material.part.domain.PartTypeDto; +import com.bonus.material.part.domain.PartTypeQueryDto; +import com.bonus.material.purchase.domain.PurchaseCheckInfo; +import com.bonus.material.purchase.domain.dto.PurchaseCheckDto; +import com.bonus.material.purchase.domain.dto.PurchaseQueryDto; + + +import java.util.List; + +/** + * 配件新购管理Service接口 + * + * @author hongchao + * @date 2025-01-08 + */ +public interface IPartArrivedService { + + /** + * 获取配件新购类型树结构 + * + * @param partId,partName 配件新购管理 + * @return 配件新购管理集合 + */ + List getTypeTree(Long partId, String partName); + + /** + * 新增新购验收任务 + * + * @param partTypeCheckDto 新购验收任务dto + * @return 结果 + */ + AjaxResult insertPartTypeCheckInfo(PartTypeCheckDto partTypeCheckDto); + + /** + * 查询新购验收任务列表 + * + * @param partTypeQueryDto 新购验收任务 + * @return 新购验收任务集合 + */ + List selectPartTypeCheckInfoList(PartTypeQueryDto partTypeQueryDto); + + /** + * 查询新购验收任务 + * + * @param partTypeQueryDto 新购验收请求条件封装dto + * @return 新购验收任务 + */ + PartTypeCheckDto selectPartTypeCheckInfoById(PartTypeQueryDto partTypeQueryDto); + + /** + * 修改新购验收任务 + * + * @param partTypeCheckDto 新购验收任务 + * @return 结果 + */ + boolean updatePartTypeCheckInfo(PartTypeCheckDto partTypeCheckDto); + + /** + * 删除新购验收任务 + * + * @param partTypeQueryDto 需要删除的新购验收任务主键集合 + * @return 结果 + */ + int deletePartInfo(PartTypeQueryDto partTypeQueryDto); +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/impl/PartAcceptServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/impl/PartAcceptServiceImpl.java new file mode 100644 index 00000000..f67b0987 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/impl/PartAcceptServiceImpl.java @@ -0,0 +1,142 @@ +package com.bonus.material.part.service.impl; + + + +import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.material.basic.domain.BmFileInfo; +import com.bonus.material.basic.mapper.BmFileInfoMapper; +import com.bonus.material.ma.domain.Type; +import com.bonus.material.part.domain.*; +import com.bonus.material.part.mapper.PartAcceptMapper; + +import com.bonus.material.part.service.IPartAcceptService; + +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.stereotype.Service; + + +import javax.annotation.Resource; + +import java.util.ArrayList; + +import java.util.List; + + + + +/** + * 配件新购管理Service业务层处理 + * + * @author hongchao + * @date 2025-01-08 + */ +@Service +public class PartAcceptServiceImpl implements IPartAcceptService +{ + @Autowired + private PartAcceptMapper partAcceptMapper; + + @Resource + BmFileInfoMapper bmFileInfoMapper; + + /** + * 查询配件类型三级树 + * @param partTypeDto + */ + @Override + public AjaxResult getTypeTree(PartTypeDto partTypeDto) { + List typeList = partAcceptMapper.getTypeTree(partTypeDto); + return AjaxResult.success(typeList); + } + + /** + * 入库 + * @param partTypeCheckDetails + * @return + */ + @Override + public AjaxResult partTypeWarehouse(List partTypeCheckDetails) { + if (partTypeCheckDetails.size() == 0){ + return AjaxResult.error("请选择要操作的记录"); + } + for (PartTypeCheckDetails partTypeCheckDetail : partTypeCheckDetails) { + int count = partAcceptMapper.partTypeWarehouse(partTypeCheckDetail); + int countTwo = partAcceptMapper.updatePartTypeStorage(partTypeCheckDetail); + + if((count+countTwo) != 2){ + return AjaxResult.error("操作失败"); + } + } + int countThree = partAcceptMapper.selectStatus(partTypeCheckDetails.get(0).getTaskId()); + if(countThree == 0) { + partAcceptMapper.updateStatus(partTypeCheckDetails.get(0).getTaskId()); + } + return AjaxResult.success(); + } + + /** + * 驳回 + * @param partTypeCheckDetails + * @return + */ + @Override + public AjaxResult partTypeReject(List partTypeCheckDetails) { + if (partTypeCheckDetails.size() == 0){ + return AjaxResult.error("请选择要操作的记录"); + } + for (PartTypeCheckDetails partTypeCheckDetail : partTypeCheckDetails) { + int count = partAcceptMapper.partTypeReject(partTypeCheckDetail); + + if(count != 1){ + return AjaxResult.error("操作失败"); + } + } + int countThree = partAcceptMapper.selectStatus(partTypeCheckDetails.get(0).getTaskId()); + if(countThree == 0) { + partAcceptMapper.updateStatus(partTypeCheckDetails.get(0).getTaskId()); + } + return AjaxResult.success(); + } + + + /** + * 外层入库 + * @param partTypeCheckInfo + * @return + */ + @Override + public AjaxResult passAll(List partTypeCheckInfo) { + if (partTypeCheckInfo.size() == 0){ + return AjaxResult.error("请选择要操作的记录"); + } + for (PartTypeCheckInfo vo : partTypeCheckInfo) { + int count = partAcceptMapper.passAll(vo.getTaskId()); + if(count == 0){ + return AjaxResult.error("操作失败"); + } + partAcceptMapper.updateStatus(vo.getTaskId()); + } + return AjaxResult.success(); + } + + /** + * 外层驳回 + * @param partTypeCheckInfo + * @return + */ + @Override + public AjaxResult rejectAll(List partTypeCheckInfo) { + if (partTypeCheckInfo.size() == 0){ + return AjaxResult.error("请选择要操作的记录"); + } + for (PartTypeCheckInfo vo : partTypeCheckInfo) { + int count = partAcceptMapper.rejectAll(vo.getTaskId()); + if(count == 0){ + return AjaxResult.error("操作失败"); + } + partAcceptMapper.updateStatus(vo.getTaskId()); + } + return AjaxResult.success(); + } +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/impl/PartArrivedServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/impl/PartArrivedServiceImpl.java new file mode 100644 index 00000000..5630335d --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/part/service/impl/PartArrivedServiceImpl.java @@ -0,0 +1,281 @@ +package com.bonus.material.part.service.impl; + + +import com.bonus.common.biz.constant.BmConfigItems; +import com.bonus.common.biz.enums.MaTypeManageTypeEnum; +import com.bonus.common.biz.enums.PurchaseTaskStageEnum; +import com.bonus.common.biz.enums.PurchaseTaskStatusEnum; +import com.bonus.common.biz.enums.TmTaskTypeEnum; +import com.bonus.common.core.exception.ServiceException; +import com.bonus.common.core.utils.DateUtils; +import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.common.security.utils.SecurityUtils; +import com.bonus.material.basic.domain.BmFileInfo; +import com.bonus.material.basic.mapper.BmFileInfoMapper; +import com.bonus.material.ma.domain.Type; +import com.bonus.material.part.domain.*; +import com.bonus.material.part.mapper.PartArrivedMapper; +import com.bonus.material.part.service.IPartArrivedService; +import com.bonus.material.purchase.domain.PurchaseCheckDetails; +import com.bonus.material.purchase.domain.PurchaseCheckInfo; +import com.bonus.material.purchase.domain.dto.PurchaseCheckDto; +import com.bonus.material.purchase.domain.dto.PurchaseQueryDto; +import com.bonus.material.task.domain.TmTask; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +import static com.bonus.common.biz.constant.MaterialConstants.PART_TASK_TYPE_LABEL; +import static com.bonus.common.biz.constant.MaterialConstants.PURCHASE_TASK_TYPE_LABEL; + +/** + * 配件新购管理Service业务层处理 + * + * @author hongchao + * @date 2025-01-08 + */ +@Service +public class PartArrivedServiceImpl implements IPartArrivedService +{ + @Autowired + private PartArrivedMapper partArrivedMapper; + + @Resource + BmFileInfoMapper bmFileInfoMapper; + + /** + * 查询配件类型三级树--前端联动式下拉框 + * @param partId 类型id + * @param partName 类型名称 + */ + @Override + public List getTypeTree(Long partId, String partName) { + List maTypes = partArrivedMapper.getTypeTree(""); + List list = new ArrayList<>(); + for (PartTypeDto maType : maTypes) { + if (maType.getParentId() == 0) { + list.add(maType); + } + } + //根据父节点获取对应的儿子节点 + for (PartTypeDto maType : list) { + List child = getChild(maTypes, maType.getPartId()); + maType.setChildren(child); + } + return list; + } + + /** + * 递归调用获取子级 + * @param list 集合 + * @param parentId 父级id + */ + public List getChild(List list, Long parentId) { + List childList = new ArrayList(); + for (PartTypeDto maType : list) { + Long partId = maType.getPartId(); + Long pid = maType.getParentId(); + if (parentId.equals(pid)) { + List childLists = getChild(list, partId); + maType.setChildren(childLists); + childList.add(maType); + } + } + return childList; + } + + /** + * 新增新购验收任务 + * + * @param partTypeCheckDto 新购验收任务 + * @return 结果 + */ + @Override + @Transactional + public AjaxResult insertPartTypeCheckInfo(PartTypeCheckDto partTypeCheckDto) { + partTypeCheckDto.getPartTypeCheckInfo().setCreateTime(DateUtils.getNowDate()); + partTypeCheckDto.getPartTypeCheckInfo().setCreateBy(SecurityUtils.getUsername()); + try { + final int thisMonthMaxOrder = partArrivedMapper.getMonthMaxOrderByDate(DateUtils.getCurrentYear(), DateUtils.getCurrentMonth(), TmTaskTypeEnum.TM_TASK_PART_TYPE.getTaskTypeId()); + String taskCode = genderTaskCode(thisMonthMaxOrder); + final TmTask tmTask = new TmTask(null, TmTaskTypeEnum.TM_TASK_PART_TYPE.getTaskTypeId(), + 0, + partTypeCheckDto.getPartTypeCheckInfo().getCompanyId(), thisMonthMaxOrder + 1, taskCode); + tmTask.setCreateTime(DateUtils.getNowDate()); + partArrivedMapper.insertTmTask(tmTask); + Long taskId = tmTask.getTaskId(); + partTypeCheckDto.getPartTypeCheckInfo().setTaskId(taskId); + final int count = partArrivedMapper.insertPartTypeCheckInfo(partTypeCheckDto.getPartTypeCheckInfo()); + if (0 < count) { + return insertPartTypeCheckDetails(partTypeCheckDto.getPartTypeCheckDetailsList(), taskId); + } else { + return AjaxResult.error("新增任务失败,purchase_part_info表插入0条"); + } + } catch (final DataAccessException e) { + return AjaxResult.error("数据库操作失败:" + e.getMessage()); + } catch (final Exception e) { + return AjaxResult.error("新增任务失败:" + e.getMessage()); + } + } + + private AjaxResult insertPartTypeCheckDetails(List partTypeCheckDetailsList, Long taskId) { + if (!CollectionUtils.isEmpty(partTypeCheckDetailsList)) { + for (PartTypeCheckDetails details : partTypeCheckDetailsList) { + details.setTaskId(taskId); + details.setStatus(0); + details.setInputStatus("0"); + final List bmFileInfos = details.getBmFileInfos(); + if (!CollectionUtils.isEmpty(bmFileInfos)) { + bmFileInfos.forEach(o -> o.setTaskId(taskId)); + bmFileInfoMapper.insertBmFileInfos(bmFileInfos); + } + } + // 批量插入详情数据 + final int count = partArrivedMapper.insertPartTypeCheckDetailsList(partTypeCheckDetailsList); + if (0 < count) { + return AjaxResult.success("新增任务成功"); + } else { + return AjaxResult.error("新增任务失败,purchase_part_detail详情表插入0条"); + } + } else { + return AjaxResult.success("新增任务成功"); + } + } + + /** + * 生成任务编号并构造Tm_Task任务对象 + * @param thisMonthMaxOrder 当月最大单号 + * @return 任务对象 + */ + private static String genderTaskCode(Integer thisMonthMaxOrder) { + final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + final Date nowDate = DateUtils.getNowDate(); + final String format = dateFormat.format(nowDate); + final String result = format.replace("-", ""); + return PART_TASK_TYPE_LABEL + result + String.format("-%03d", thisMonthMaxOrder + 1); + } + + + /** + * 查询新购验收任务列表 + * + * @param partTypeQueryDto 新购验收任务请求参数 + * @return 新购验收任务 + */ + @Override + public List selectPartTypeCheckInfoList(PartTypeQueryDto partTypeQueryDto) { + List partTypeCheckInfos = partArrivedMapper.selectPartTypeCheckInfoJoinList(partTypeQueryDto); + int count = 0; + for (int i = 0; i < partTypeCheckInfos.size(); i++) { + List partTypeCheckDetails = partArrivedMapper.selectPartTypeCheckDetailsList(partTypeCheckInfos.get(i).getTaskId()); + if(partTypeCheckDetails.size()>0){ + count = (int) partTypeCheckDetails.stream() + .filter(details -> details.getStatus() == 0) + .count(); + if(count>0){ + partTypeCheckInfos.get(i).setTaskStatusName("未完成"); + }else{ + partTypeCheckInfos.get(i).setTaskStatusName("已完成"); + } + } + + BigDecimal purchaseNum = new BigDecimal(0); + BigDecimal purchasePrice = new BigDecimal(0); + BigDecimal purchaseTaxPrice = new BigDecimal(0); + String partName = ""; + for (int j = 0; j < partTypeCheckDetails.size(); j++) { + purchaseNum = purchaseNum.add(partTypeCheckDetails.get(j).getPurchaseNum()); + purchasePrice = purchasePrice.add(partTypeCheckDetails.get(j).getPurchasePrice().multiply(partTypeCheckDetails.get(j).getPurchaseNum())); + purchaseTaxPrice = purchaseTaxPrice.add(partTypeCheckDetails.get(j).getPurchaseTaxPrice().multiply(partTypeCheckDetails.get(j).getPurchaseNum())); + partName = partName + partTypeCheckDetails.get(j).getMaTypeName(); + if (j < partTypeCheckDetails.size() - 1) { + partName += ","; + } + } + partTypeCheckInfos.get(i).setPurchaseMaNumber(purchaseNum); + partTypeCheckInfos.get(i).setPurchasePrice(purchasePrice); + partTypeCheckInfos.get(i).setPurchaseTaxPrice(purchaseTaxPrice); + partTypeCheckInfos.get(i).setPurchaseMaTypeName(partName); + } + return partTypeCheckInfos; + } + + /** + * 查询新购验收任务列表详情 + * + * @param partTypeQueryDto 新购验收任务请求参数 + * @return 新购验收任务 + */ + @Override + public PartTypeCheckDto selectPartTypeCheckInfoById(PartTypeQueryDto partTypeQueryDto) { + PartTypeCheckInfo partTypeCheckInfo = partArrivedMapper.selectPartTypeCheckInfoById(partTypeQueryDto.getId()); + PartTypeCheckDto PartTypeCheckDto = new PartTypeCheckDto(); + PartTypeCheckDto.setPartTypeCheckInfo(partTypeCheckInfo); + if(null != partTypeCheckInfo){ + List partTypeCheckDetailsList = partArrivedMapper.selectPartTypeCheckDetailsListByQueryDto(partTypeQueryDto); + PartTypeCheckDto.setPartTypeCheckDetailsList(partTypeCheckDetailsList); + } + return PartTypeCheckDto; + } + + /** + * 修改新购验收任务 + * + * @param partTypeCheckDto 新购验收任务 + * @return 结果 + */ + @Override + @Transactional + public boolean updatePartTypeCheckInfo(PartTypeCheckDto partTypeCheckDto) { + partTypeCheckDto.getPartTypeCheckInfo().setUpdateTime(DateUtils.getNowDate()); + partTypeCheckDto.getPartTypeCheckInfo().setUpdateBy(SecurityUtils.getUsername()); + if (!CollectionUtils.isEmpty(partTypeCheckDto.getPartTypeCheckDetailsList())) { + partTypeCheckDto.getPartTypeCheckDetailsList().removeIf(Objects::isNull); + partTypeCheckDto.getPartTypeCheckDetailsList().removeIf(o -> Objects.isNull(o.getStatus())); + partTypeCheckDto.getPartTypeCheckDetailsList().removeIf(o -> + !Objects.equals(o.getStatus(), 0)); + } + try { + Long[] ids = new Long[partTypeCheckDto.getPartTypeCheckDetailsList().size()]; + int index = 0; + for (PartTypeCheckDetails details : partTypeCheckDto.getPartTypeCheckDetailsList()) { + ids[index] = details.getId(); + index++; + } + partArrivedMapper.deletePartTypeCheckDetailsByParentIds(partTypeCheckDto.getPartTypeCheckInfo().getTaskId()); + if (ids.length > 0) { + insertPartTypeCheckDetails(partTypeCheckDto.getPartTypeCheckDetailsList(), partTypeCheckDto.getPartTypeCheckInfo().getTaskId()); + } + return true; + } catch (final Exception e) { + throw new ServiceException("错误信息描述"); + } + } + + /** + * 删除新购验收任务 + * + * @param partTypeQueryDto 需要删除的新购验收任务主键 + * @return 结果 + */ + @Override + @Transactional + public int deletePartInfo(PartTypeQueryDto partTypeQueryDto) { + int count = partArrivedMapper.deleteTmTask(partTypeQueryDto.getTaskId()); + if(count==0){ + AjaxResult.error("删除失败"); + } + partArrivedMapper.deletePartTypeCheckDetailsByParentIds(partTypeQueryDto.getTaskId()); + return partArrivedMapper.deletePartTypCheckInfoById(partTypeQueryDto.getId()); + } +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/scrap/service/impl/ScrapReasonServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/scrap/service/impl/ScrapReasonServiceImpl.java index 7cde428e..224300f0 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/scrap/service/impl/ScrapReasonServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/scrap/service/impl/ScrapReasonServiceImpl.java @@ -15,10 +15,10 @@ import org.springframework.stereotype.Service; import java.util.List; /** - * 仓库管理Service业务层处理 + * 报废原因Service业务层处理 * - * @author xsheng - * @date 2024-09-27 + * @author hongchao + * @date 2025-01-07 */ @Service public class ScrapReasonServiceImpl implements IScrapReasonService diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/part/PartAcceptMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/part/PartAcceptMapper.xml new file mode 100644 index 00000000..4411e030 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/part/PartAcceptMapper.xml @@ -0,0 +1,74 @@ + + + + + + + + + + update purchase_part_details + set status = 1 + where id = #{id} and del_flag = 0 + + + + update ma_part_type + set storage_num = storage_num + #{purchaseNum} + where pa_id = #{partId} and del_flag = '0' + + + + update purchase_part_details + set status = 2 + where id = #{id} and del_flag = 0 + + + + + + update tm_task + set task_status = 1 + where task_id = #{taskId} + + + + update purchase_part_details + set status = 1 + where task_id = #{taskId} and status = 0 and del_flag = 0 + + + + update purchase_part_details + set status = 2 + where task_id = #{taskId} and status = 0 and del_flag = 0 + + \ No newline at end of file diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/part/PartArrivedMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/part/PartArrivedMapper.xml new file mode 100644 index 00000000..4323310e --- /dev/null +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/part/PartArrivedMapper.xml @@ -0,0 +1,171 @@ + + + + + + + + + + insert into tm_task + + pre_task_id, + task_type, + task_status, + `code`, + month_order, + create_by, + create_time, + update_by, + update_time, + remark, + company_id, + + + #{preTaskId}, + #{taskType}, + #{taskStatus}, + #{code}, + #{monthOrder}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{companyId}, + + + + + insert into purchase_part_info + + task_id, + purchase_time, + arrival_time, + purchaser, + supplier_id, + tax_rate, + create_by, + create_time, + update_by, + update_time, + remark, + company_id, + + + #{taskId}, + #{purchaseTime}, + #{arrivalTime}, + #{purchaser}, + #{supplierId}, + #{taxRate}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{companyId}, + + + + + + insert into purchase_part_details(task_id,part_id,purchase_price,purchase_tax_price, + purchase_num,check_num,check_result,supplier_id, + status,production_time,create_by,create_time,update_by, + update_time,remark,input_num, + input_time,company_id,del_flag) + values + + (#{item.taskId},#{item.partId},#{item.purchasePrice},#{item.purchaseTaxPrice}, + #{item.purchaseNum},#{item.checkNum},#{item.checkResult},#{item.supplierId}, + #{item.status},#{item.productionTime},#{item.createBy},NOW(),#{item.updateBy}, + #{item.updateTime},#{item.remark},#{item.inputNum}, + #{item.inputTime},#{item.companyId},0) + + + + + + + + + + + + + delete from purchase_part_details ppd where task_id = #{taskId} and ppd.status = 0 + + + + delete from tm_task where task_id = #{taskId} + + + + delete from purchase_part_info where id = #{id} + + \ No newline at end of file