yzc 2 lat temu
rodzic
commit
2e7d1a149d
28 zmienionych plików z 768 dodań i 4 usunięć
  1. 60 0
      hx-jxst/src/main/java/com/fjhx/jxst/controller/after/AfterSalesRecordController.java
  2. 19 0
      hx-jxst/src/main/java/com/fjhx/jxst/controller/after/AfterSalesRecordDetailController.java
  3. 23 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/after/dto/AfterSalesRecordDetailDto.java
  4. 17 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/after/dto/AfterSalesRecordDetailSelectDto.java
  5. 25 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/after/dto/AfterSalesRecordDto.java
  6. 17 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/after/dto/AfterSalesRecordSelectDto.java
  7. 51 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/after/po/AfterSalesRecord.java
  8. 45 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/after/po/AfterSalesRecordDetail.java
  9. 17 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/after/vo/AfterSalesRecordDetailVo.java
  10. 34 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/after/vo/AfterSalesRecordVo.java
  11. 5 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/po/SalesContract.java
  12. 17 0
      hx-jxst/src/main/java/com/fjhx/jxst/mapper/after/AfterSalesRecordDetailMapper.java
  13. 26 0
      hx-jxst/src/main/java/com/fjhx/jxst/mapper/after/AfterSalesRecordMapper.java
  14. 17 0
      hx-jxst/src/main/java/com/fjhx/jxst/service/after/AfterSalesRecordDetailService.java
  15. 41 0
      hx-jxst/src/main/java/com/fjhx/jxst/service/after/AfterSalesRecordService.java
  16. 21 0
      hx-jxst/src/main/java/com/fjhx/jxst/service/after/impl/AfterSalesRecordDetailServiceImpl.java
  17. 151 0
      hx-jxst/src/main/java/com/fjhx/jxst/service/after/impl/AfterSalesRecordServiceImpl.java
  18. 2 0
      hx-jxst/src/main/java/com/fjhx/jxst/service/sales/impl/SalesContractServiceImpl.java
  19. 103 0
      hx-jxst/src/main/java/com/fjhx/jxst/utils/CodeEnum.java
  20. 4 0
      hx-jxst/src/main/resources/mapper/after/AfterSalesRecordDetailMapper.xml
  21. 21 0
      hx-jxst/src/main/resources/mapper/after/AfterSalesRecordMapper.xml
  22. 8 0
      hx-mes/src/main/java/com/fjhx/mes/controller/production/ProductionTaskDetailController.java
  23. 9 0
      hx-mes/src/main/java/com/fjhx/mes/entity/production/vo/ProductionTaskDetailVo.java
  24. 2 1
      hx-mes/src/main/java/com/fjhx/mes/mapper/production/ProductionTaskDetailMapper.java
  25. 2 0
      hx-mes/src/main/java/com/fjhx/mes/service/production/ProductionTaskDetailService.java
  26. 12 0
      hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionTaskDetailServiceImpl.java
  27. 15 0
      hx-mes/src/main/resources/mapper/production/ProductionTaskDetailMapper.xml
  28. 4 3
      hx-purchase/src/main/java/com/fjhx/purchase/service/arrival/impl/ArrivalServiceImpl.java

+ 60 - 0
hx-jxst/src/main/java/com/fjhx/jxst/controller/after/AfterSalesRecordController.java

@@ -0,0 +1,60 @@
+package com.fjhx.jxst.controller.after;
+
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.jxst.entity.after.vo.AfterSalesRecordVo;
+import com.fjhx.jxst.entity.after.dto.AfterSalesRecordSelectDto;
+import com.fjhx.jxst.entity.after.dto.AfterSalesRecordDto;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.fjhx.jxst.service.after.AfterSalesRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+/**
+ * <p>
+ * 售后记录 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-25
+ */
+@RestController
+@RequestMapping("/afterSalesRecord")
+public class AfterSalesRecordController {
+
+    @Autowired
+    private AfterSalesRecordService afterSalesRecordService;
+
+    /**
+     * 售后记录分页
+     */
+    @PostMapping("/page")
+    public Page<AfterSalesRecordVo> page(@RequestBody AfterSalesRecordSelectDto dto) {
+        return afterSalesRecordService.getPage(dto);
+    }
+
+    /**
+     * 售后记录明细
+     */
+    @PostMapping("/detail")
+    public AfterSalesRecordVo detail(@RequestBody BaseSelectDto dto) {
+        return afterSalesRecordService.detail(dto.getId());
+    }
+
+    /**
+     * 售后记录新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody AfterSalesRecordDto afterSalesRecordDto) {
+        afterSalesRecordService.add(afterSalesRecordDto);
+    }
+    /**
+     * 售后记录提交
+     */
+    @PostMapping("/afterSales")
+    public void afterSales(@RequestBody AfterSalesRecordDto afterSalesRecordDto) {
+        afterSalesRecordService.afterSales(afterSalesRecordDto);
+    }
+
+
+}

+ 19 - 0
hx-jxst/src/main/java/com/fjhx/jxst/controller/after/AfterSalesRecordDetailController.java

@@ -0,0 +1,19 @@
+package com.fjhx.jxst.controller.after;
+
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * <p>
+ * 售后记录明细 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-25
+ */
+@RestController
+@RequestMapping("/afterSalesRecordDetail")
+public class AfterSalesRecordDetailController {
+
+
+}

+ 23 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/after/dto/AfterSalesRecordDetailDto.java

@@ -0,0 +1,23 @@
+package com.fjhx.jxst.entity.after.dto;
+
+import com.fjhx.file.entity.ObsFile;
+import com.fjhx.jxst.entity.after.po.AfterSalesRecordDetail;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 售后记录明细新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-05-25
+ */
+@Getter
+@Setter
+public class AfterSalesRecordDetailDto extends AfterSalesRecordDetail {
+    /**
+     * 现场照片列表
+     */
+    private List<ObsFile> fileList;
+}

+ 17 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/after/dto/AfterSalesRecordDetailSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.jxst.entity.after.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 售后记录明细列表查询入参实体
+ *
+ * @author 
+ * @since 2023-05-25
+ */
+@Getter
+@Setter
+public class AfterSalesRecordDetailSelectDto extends BaseSelectDto {
+
+}

+ 25 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/after/dto/AfterSalesRecordDto.java

@@ -0,0 +1,25 @@
+package com.fjhx.jxst.entity.after.dto;
+
+import com.fjhx.jxst.entity.after.po.AfterSalesRecord;
+import com.fjhx.jxst.entity.after.po.AfterSalesRecordDetail;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 售后记录新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-05-25
+ */
+@Getter
+@Setter
+public class AfterSalesRecordDto extends AfterSalesRecord {
+
+    /**
+     * 售后明细列表
+     */
+    private List<AfterSalesRecordDetailDto> afterSalesRecordDetailList;
+
+}

+ 17 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/after/dto/AfterSalesRecordSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.jxst.entity.after.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 售后记录列表查询入参实体
+ *
+ * @author 
+ * @since 2023-05-25
+ */
+@Getter
+@Setter
+public class AfterSalesRecordSelectDto extends BaseSelectDto {
+
+}

+ 51 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/after/po/AfterSalesRecord.java

@@ -0,0 +1,51 @@
+package com.fjhx.jxst.entity.after.po;
+
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 售后记录
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-25
+ */
+@Getter
+@Setter
+@TableName("after_sales_record")
+public class AfterSalesRecord extends BasePo {
+
+    /**
+     * 产品sn
+     */
+    private String productSn;
+
+    /**
+     * 售后人id
+     */
+    private Long afterSalesPersonId;
+
+    /**
+     * 售后原因
+     */
+    private String remark;
+
+    /**
+     * 产品编号
+     */
+    private String code;
+
+    /**
+     * 销售状态
+     */
+    private int status;
+    /**
+     * 产品id
+     */
+    private Long productId;
+
+}

+ 45 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/after/po/AfterSalesRecordDetail.java

@@ -0,0 +1,45 @@
+package com.fjhx.jxst.entity.after.po;
+
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+
+/**
+ * <p>
+ * 售后记录明细
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-25
+ */
+@Getter
+@Setter
+@TableName("after_sales_record_detail")
+public class AfterSalesRecordDetail extends BasePo {
+
+    /**
+     * 售后记录id
+     */
+    private Long afterSalesRecordId;
+
+    /**
+     * 配件id
+     */
+    @NotEmpty(message = "配件id不能为空")
+    private Long accessoriesId;
+
+    /**
+     * 售后数量 备用字段
+     */
+    private Long quantity;
+
+    /**
+     * 售后记录
+     */
+    private String remark;
+
+}

+ 17 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/after/vo/AfterSalesRecordDetailVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.jxst.entity.after.vo;
+
+import com.fjhx.jxst.entity.after.po.AfterSalesRecordDetail;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 售后记录明细列表查询返回值实体
+ *
+ * @author 
+ * @since 2023-05-25
+ */
+@Getter
+@Setter
+public class AfterSalesRecordDetailVo extends AfterSalesRecordDetail {
+
+}

+ 34 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/after/vo/AfterSalesRecordVo.java

@@ -0,0 +1,34 @@
+package com.fjhx.jxst.entity.after.vo;
+
+import com.fjhx.jxst.entity.after.po.AfterSalesRecord;
+import com.fjhx.mes.entity.bom.vo.BomDetailVo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 售后记录列表查询返回值实体
+ *
+ * @author 
+ * @since 2023-05-25
+ */
+@Getter
+@Setter
+public class AfterSalesRecordVo extends AfterSalesRecord {
+
+    /**
+     * 产品名称
+     */
+    private String productName;
+
+    /**
+     * bomInfoId
+     */
+    private Long bomInfoId;
+
+    /**
+     * bom明细列表
+     */
+    List<BomDetailVo> bomDetailList;
+}

+ 5 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/po/SalesContract.java

@@ -61,4 +61,9 @@ public class SalesContract extends BasePo {
      */
     private BigDecimal contractAmount;
 
+    /**
+     * 合同编号
+     */
+    private String code;
+
 }

+ 17 - 0
hx-jxst/src/main/java/com/fjhx/jxst/mapper/after/AfterSalesRecordDetailMapper.java

@@ -0,0 +1,17 @@
+package com.fjhx.jxst.mapper.after;
+
+import com.fjhx.jxst.entity.after.po.AfterSalesRecordDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * <p>
+ * 售后记录明细 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-25
+ */
+public interface AfterSalesRecordDetailMapper extends BaseMapper<AfterSalesRecordDetail> {
+
+}

+ 26 - 0
hx-jxst/src/main/java/com/fjhx/jxst/mapper/after/AfterSalesRecordMapper.java

@@ -0,0 +1,26 @@
+package com.fjhx.jxst.mapper.after;
+
+import com.fjhx.jxst.entity.after.po.AfterSalesRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.jxst.entity.after.vo.AfterSalesRecordVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+
+/**
+ * <p>
+ * 售后记录 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-25
+ */
+public interface AfterSalesRecordMapper extends BaseMapper<AfterSalesRecord> {
+
+    /**
+     * 售后记录分页
+     */
+    Page<AfterSalesRecordVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<AfterSalesRecord> wrapper);
+
+}

+ 17 - 0
hx-jxst/src/main/java/com/fjhx/jxst/service/after/AfterSalesRecordDetailService.java

@@ -0,0 +1,17 @@
+package com.fjhx.jxst.service.after;
+
+import com.fjhx.jxst.entity.after.po.AfterSalesRecordDetail;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 售后记录明细 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-25
+ */
+public interface AfterSalesRecordDetailService extends BaseService<AfterSalesRecordDetail> {
+
+}

+ 41 - 0
hx-jxst/src/main/java/com/fjhx/jxst/service/after/AfterSalesRecordService.java

@@ -0,0 +1,41 @@
+package com.fjhx.jxst.service.after;
+
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.fjhx.jxst.entity.after.po.AfterSalesRecord;
+import com.ruoyi.common.core.service.BaseService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.jxst.entity.after.vo.AfterSalesRecordVo;
+import com.fjhx.jxst.entity.after.dto.AfterSalesRecordSelectDto;
+import com.fjhx.jxst.entity.after.dto.AfterSalesRecordDto;
+
+
+/**
+ * <p>
+ * 售后记录 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-25
+ */
+public interface AfterSalesRecordService extends BaseService<AfterSalesRecord> {
+
+    /**
+     * 售后记录分页
+     */
+    Page<AfterSalesRecordVo> getPage(AfterSalesRecordSelectDto dto);
+
+    /**
+     * 售后记录明细
+     */
+    AfterSalesRecordVo detail(Long id);
+
+    /**
+     * 售后记录新增
+     */
+    void add(AfterSalesRecordDto afterSalesRecordDto);
+
+    /**
+     * 售后提交
+     */
+    void afterSales(AfterSalesRecordDto afterSalesRecordDto);
+}

+ 21 - 0
hx-jxst/src/main/java/com/fjhx/jxst/service/after/impl/AfterSalesRecordDetailServiceImpl.java

@@ -0,0 +1,21 @@
+package com.fjhx.jxst.service.after.impl;
+
+import com.fjhx.jxst.entity.after.po.AfterSalesRecordDetail;
+import com.fjhx.jxst.mapper.after.AfterSalesRecordDetailMapper;
+import com.fjhx.jxst.service.after.AfterSalesRecordDetailService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 售后记录明细 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-25
+ */
+@Service
+public class AfterSalesRecordDetailServiceImpl extends ServiceImpl<AfterSalesRecordDetailMapper, AfterSalesRecordDetail> implements AfterSalesRecordDetailService {
+
+}

+ 151 - 0
hx-jxst/src/main/java/com/fjhx/jxst/service/after/impl/AfterSalesRecordServiceImpl.java

@@ -0,0 +1,151 @@
+package com.fjhx.jxst.service.after.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.fjhx.common.utils.Assert;
+import com.fjhx.file.utils.ObsFileUtil;
+import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.jxst.entity.after.dto.AfterSalesRecordDetailDto;
+import com.fjhx.jxst.entity.after.po.AfterSalesRecord;
+import com.fjhx.jxst.entity.after.po.AfterSalesRecordDetail;
+import com.fjhx.jxst.mapper.after.AfterSalesRecordMapper;
+import com.fjhx.jxst.service.after.AfterSalesRecordDetailService;
+import com.fjhx.jxst.service.after.AfterSalesRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.jxst.utils.CodeEnum;
+import com.fjhx.mes.entity.bom.po.BomDetail;
+import com.fjhx.mes.entity.bom.po.BomInfo;
+import com.fjhx.mes.entity.bom.vo.BomDetailVo;
+import com.fjhx.mes.entity.production.vo.ProductionTaskDetailVo;
+import com.fjhx.mes.entity.work.po.WorkOrder;
+import com.fjhx.mes.entity.work.po.WorkOrderBom;
+import com.fjhx.mes.service.bom.BomDetailService;
+import com.fjhx.mes.service.bom.BomInfoService;
+import com.fjhx.mes.service.production.ProductionTaskDetailService;
+import com.fjhx.mes.service.work.WorkOrderBomService;
+import com.fjhx.mes.service.work.WorkOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.jxst.entity.after.vo.AfterSalesRecordVo;
+import com.fjhx.jxst.entity.after.dto.AfterSalesRecordSelectDto;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.fjhx.jxst.entity.after.dto.AfterSalesRecordDto;
+import cn.hutool.core.bean.BeanUtil;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+
+/**
+ * <p>
+ * 售后记录 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-05-25
+ */
+@Service
+public class AfterSalesRecordServiceImpl extends ServiceImpl<AfterSalesRecordMapper, AfterSalesRecord> implements AfterSalesRecordService {
+
+    @Autowired
+    private ProductionTaskDetailService productionTaskDetailService;
+    @Autowired
+    private WorkOrderService workOrderService;
+    @Autowired
+    private ProductInfoService productInfoService;
+    @Autowired
+    private WorkOrderBomService workOrderBomService;
+    @Autowired
+    private BomInfoService bomInfoService;
+    @Autowired
+    private BomDetailService bomDetailService;
+    @Autowired
+    private AfterSalesRecordDetailService afterSalesRecordDetailService;
+
+    @Override
+    public Page<AfterSalesRecordVo> getPage(AfterSalesRecordSelectDto dto) {
+        IWrapper<AfterSalesRecord> wrapper = getWrapper();
+        wrapper.orderByDesc("asr", AfterSalesRecord::getId);
+        Page<AfterSalesRecordVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        List<AfterSalesRecordVo> records = page.getRecords();
+        //赋值产品信息
+        productInfoService.attributeAssign(records, AfterSalesRecordVo::getProductId, (item, productInfo) -> {
+            item.setProductName(productInfo.getName());
+        });
+        return page;
+    }
+
+    @Override
+    public AfterSalesRecordVo detail(Long id) {
+        AfterSalesRecord AfterSalesRecord = this.getById(id);
+        AfterSalesRecordVo result = BeanUtil.toBean(AfterSalesRecord, AfterSalesRecordVo.class);
+
+        //赋值产品信息
+        productInfoService.attributeAssign(Arrays.asList(result), AfterSalesRecordVo::getProductId, (item, productInfo) -> {
+            item.setProductName(productInfo.getName());
+        });
+
+        ProductionTaskDetailVo productionTaskDetailVo = productionTaskDetailService.snInfo(result.getProductSn());
+        if (ObjectUtil.isEmpty(productionTaskDetailVo)){
+            return result;
+        }
+        //获取工单信息
+        WorkOrder workOrder = workOrderService.getById(productionTaskDetailVo.getWorkOrderId());
+        //查询BOM信息
+        BomInfo bomInfo = bomInfoService.getOne(q -> q.eq(BomInfo::getProductId, workOrder.getProductId()).eq(BomInfo::getCurrentVersion,1));
+        Assert.notEmpty(bomInfo,"查询不到产品的BOM信息");
+        result.setBomInfoId(bomInfo.getId());
+
+        List<BomDetailVo> bomDetailList = new ArrayList<>();
+        //判断是否定制
+        if("1".equals(workOrder.getIsCustomized())){
+            //是定制
+            List<WorkOrderBom> list = workOrderBomService.list(q -> q.eq(WorkOrderBom::getWorkOrderId, workOrder.getId()));
+            bomDetailList = BeanUtil.copyToList(list, BomDetailVo.class);
+        }else{
+            //不是定制
+            List<BomDetail> list = bomDetailService.list(q -> q.eq(BomDetail::getBomInfoId, bomInfo.getId()));
+            bomDetailList = BeanUtil.copyToList(list, BomDetailVo.class);
+        }
+        Assert.notEmpty(bomDetailList,"查询不到产品的BOM明细");
+        //给bom明细赋值产品名称
+        productInfoService.attributeAssign(bomDetailList, BomDetailVo::getProductId, (item, productInfo) -> {
+            item.setProductName(productInfo.getName());
+        });
+
+        result.setBomDetailList(bomDetailList);
+        return result;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(AfterSalesRecordDto afterSalesRecordDto) {
+        Assert.notEmpty(afterSalesRecordDto.getProductId(),"产品id不能为空");
+        Assert.notEmpty(afterSalesRecordDto.getProductSn(),"产品sn不能为空");
+        afterSalesRecordDto.setCode(CodeEnum.AFTER_SALES.getCode());
+        this.save(afterSalesRecordDto);
+    }
+
+    @DSTransactional
+    @Override
+    public void afterSales(AfterSalesRecordDto afterSalesRecordDto) {
+        Assert.notEmpty(afterSalesRecordDto.getId(),"售后id不能为空");
+        Assert.notEmpty(afterSalesRecordDto.getAfterSalesRecordDetailList(),"售后明细列表不能为空");
+        afterSalesRecordDto.setStatus(1);//修改为售后完成
+        this.updateById(afterSalesRecordDto);
+        List<AfterSalesRecordDetailDto> afterSalesRecordDetailList = afterSalesRecordDto.getAfterSalesRecordDetailList();
+        for (AfterSalesRecordDetailDto afterSalesRecordDetailDto : afterSalesRecordDetailList) {
+            long id = IdWorker.getId();
+            afterSalesRecordDetailDto.setId(id);
+            afterSalesRecordDetailDto.setAfterSalesRecordId(afterSalesRecordDetailDto.getId());
+            ObsFileUtil.saveFile(afterSalesRecordDetailDto.getFileList(),id);
+        }
+        List<AfterSalesRecordDetail> afterSalesRecordDetails = BeanUtil.copyToList(afterSalesRecordDetailList, AfterSalesRecordDetail.class);
+        afterSalesRecordDetailService.saveBatch(afterSalesRecordDetails);
+    }
+
+}

+ 2 - 0
hx-jxst/src/main/java/com/fjhx/jxst/service/sales/impl/SalesContractServiceImpl.java

@@ -16,6 +16,7 @@ import com.fjhx.jxst.entity.sales.vo.SalesContractVo;
 import com.fjhx.jxst.mapper.sales.SalesContractMapper;
 import com.fjhx.jxst.service.sales.SalesContractDetailsService;
 import com.fjhx.jxst.service.sales.SalesContractService;
+import com.fjhx.jxst.utils.CodeEnum;
 import com.fjhx.wms.entity.stock.vo.StockVo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -95,6 +96,7 @@ public class SalesContractServiceImpl extends ServiceImpl<SalesContractMapper, S
             count.add(salesContractDetails.getUnitPrice().multiply(salesContractDetails.getQuantity()));
         }
         salesContractDto.setContractAmount(count);
+        salesContractDto.setCode(CodeEnum.SALES_CONTRACT.getCode());
         this.save(salesContractDto);
         for (SalesContractDetails salesContractDetails : salesContractDetailsList) {
             salesContractDetails.setSalesContractId(salesContractDto.getId());

+ 103 - 0
hx-jxst/src/main/java/com/fjhx/jxst/utils/CodeEnum.java

@@ -0,0 +1,103 @@
+package com.fjhx.jxst.utils;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fjhx.jxst.service.sales.SalesContractService;
+import com.fjhx.mes.service.production.ProductionPlanService;
+import com.fjhx.mes.service.production.ProductionTaskService;
+import com.fjhx.mes.service.work.WorkOrderService;
+import com.obs.services.internal.ServiceException;
+import lombok.Getter;
+
+import java.util.Date;
+import java.util.Map;
+
+@Getter
+public enum CodeEnum {
+
+    // 销售合同
+    SALES_CONTRACT("SC", "yyMM-", "code", 3, SalesContractService.class),
+    // 销售合同
+    AFTER_SALES("SB", "yyMM-", "code", 3, SalesContractService.class);
+
+    CodeEnum(String prefix, String dateFormat, String codeFieldName, Integer length, Class<? extends IService<?>> serviceCls) {
+        this.prefix = prefix;
+        this.dateFormat = dateFormat;
+        this.length = length;
+        this.codeFieldName = codeFieldName;
+        this.service = SpringUtil.getBean(serviceCls);
+    }
+
+    // 编码前缀
+    private final String prefix;
+    // 编码加日期规则
+    private final String dateFormat;
+    // 长度
+    private final Integer length;
+    // 编码字段名
+    private final String codeFieldName;
+    // service
+    private final IService<?> service;
+
+    /**
+     * 获取键值对
+     */
+    public String getCode() {
+        String itemPrefix;
+
+        if (ObjectUtil.isNotEmpty(dateFormat)) {
+            Date date = new Date();
+            String format = DateUtil.format(date, dateFormat);
+            itemPrefix = prefix + format;
+        } else {
+            itemPrefix = prefix;
+        }
+
+        Object obj = service.query()
+                .likeRight(codeFieldName, itemPrefix)
+                .orderByDesc(codeFieldName)
+                .last("limit 1")
+                .one();
+
+        if (obj == null) {
+            return itemPrefix + autoGenericCode(length, 0);
+        }
+
+        Map<String, Object> map = Convert.toMap(String.class, Object.class, obj);
+
+        String code = Convert.toStr(map.get(CharSequenceUtil.toCamelCase(codeFieldName)));
+        Integer codeNum = Convert.toInt(code.substring(itemPrefix.length()));
+        if (ObjectUtil.isEmpty(codeNum)) {
+            throw new ServiceException("自定义编码与系统编码生成规则冲突,暂时无法生成编码,请联系管理员");
+        }
+
+        return itemPrefix + autoGenericCode(length, codeNum);
+    }
+
+    /**
+     * 获取键值对
+     */
+    public String getCode(String code) {
+        if (ObjectUtil.isNotEmpty(code)) {
+            Long count = service.query().eq(codeFieldName, code).count();
+            if (count != 0) {
+                throw new ServiceException("编码已存在");
+            }
+            return code;
+        } else {
+            return getCode();
+        }
+    }
+
+    /**
+     * 不够位数的在前面补0,保留num的长度位数字
+     */
+    private static String autoGenericCode(int length, Integer codeNum) {
+        return String.format("%0" + length + "d", codeNum + 1);
+    }
+
+}

+ 4 - 0
hx-jxst/src/main/resources/mapper/after/AfterSalesRecordDetailMapper.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.jxst.mapper.after.AfterSalesRecordDetailMapper">
+</mapper>

+ 21 - 0
hx-jxst/src/main/resources/mapper/after/AfterSalesRecordMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.jxst.mapper.after.AfterSalesRecordMapper">
+    <select id="getPage" resultType="com.fjhx.jxst.entity.after.vo.AfterSalesRecordVo">
+        select
+            asr.id,
+            asr.product_sn,
+            asr.after_sales_person_id,
+            asr.remark,
+            asr.code,
+            asr.product_id,
+            asr.status,
+            asr.create_user,
+            asr.create_time,
+            asr.update_user,
+            asr.update_time
+        from after_sales_record asr
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>

+ 8 - 0
hx-mes/src/main/java/com/fjhx/mes/controller/production/ProductionTaskDetailController.java

@@ -82,4 +82,12 @@ public class ProductionTaskDetailController {
         productionTaskDetailService.rejection(productionTaskDetailDto);
     }
 
+    /**
+     * 获取sn信息
+     */
+    @PostMapping("/snInfo")
+    public ProductionTaskDetailVo snInfo(@RequestBody ProductionTaskDetailDto productionTaskDetailDto) {
+        return productionTaskDetailService.snInfo(productionTaskDetailDto.getProductSn());
+    }
+
 }

+ 9 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/production/vo/ProductionTaskDetailVo.java

@@ -38,4 +38,13 @@ public class ProductionTaskDetailVo extends ProductionTaskDetail {
      */
     private String circulationUserName;
 
+    /**
+     * 产品编号
+     */
+    private String code;
+
+    /**
+     * 工单id
+     */
+    private Long workOrderId;
 }

+ 2 - 1
hx-mes/src/main/java/com/fjhx/mes/mapper/production/ProductionTaskDetailMapper.java

@@ -4,7 +4,6 @@ import com.fjhx.mes.entity.production.po.ProductionTaskDetail;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.mes.entity.production.vo.ProductionTaskDetailVo;
-import com.fjhx.mes.entity.work.po.WorkOrder;
 import com.fjhx.mes.entity.work.vo.WorkOrderVo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.apache.ibatis.annotations.Param;
@@ -29,4 +28,6 @@ public interface ProductionTaskDetailMapper extends BaseMapper<ProductionTaskDet
 
     List<WorkOrderVo> getWorkOrderByProductionTask(@Param("ew") IWrapper<ProductionTaskDetail> wrapper);
 
+    ProductionTaskDetailVo snInfo(@Param("sn") String sn);
+
 }

+ 2 - 0
hx-mes/src/main/java/com/fjhx/mes/service/production/ProductionTaskDetailService.java

@@ -52,4 +52,6 @@ public interface ProductionTaskDetailService extends BaseService<ProductionTaskD
      * 生产任务拒绝接收
      */
     void rejection(ProductionTaskDetailDto productionTaskDetailDto);
+
+    ProductionTaskDetailVo snInfo(String sn);
 }

+ 12 - 0
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionTaskDetailServiceImpl.java

@@ -3,6 +3,7 @@ package com.fjhx.mes.service.production.impl;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.utils.Assert;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.mes.entity.applicable.po.ApplicableProducts;
@@ -299,4 +300,15 @@ public class ProductionTaskDetailServiceImpl extends ServiceImpl<ProductionTaskD
     }
 
 
+    @Override
+    public ProductionTaskDetailVo snInfo(String sn){
+        Assert.notEmpty(sn, "sn不能为空");
+        ProductionTaskDetailVo productionTaskDetailVo = baseMapper.snInfo(sn);
+        Assert.notEmpty(productionTaskDetailVo, "查询不到sn信息");
+        ProductInfo productInfo = productInfoService.getById(productionTaskDetailVo.getProductId());
+        Assert.notEmpty(productInfo, "查询不到产品信息");
+        productionTaskDetailVo.setProductName(productInfo.getName());
+        return productionTaskDetailVo;
+    }
+
 }

+ 15 - 0
hx-mes/src/main/resources/mapper/production/ProductionTaskDetailMapper.xml

@@ -31,5 +31,20 @@
                 LEFT JOIN production_task pt ON pt.production_plan_id = pp.id
             ${ew.customSqlSegment}
     </select>
+    <select id="snInfo" resultType="com.fjhx.mes.entity.production.vo.ProductionTaskDetailVo">
+        SELECT
+            ptd.product_id,
+            ptd.product_sn,
+            sc.`code`,
+            wo.id workOrderId
+        FROM
+            production_task_detail ptd
+                JOIN production_task pt ON ptd.production_task_id = pt.id
+                JOIN production_plan pp ON pt.production_plan_id = pp.id
+                JOIN work_order wo ON pp.work_order_id = wo.id
+                JOIN bytesailing_jxst.sales_contract sc ON wo.source_id = sc.id
+        WHERE
+            ptd.product_sn = #{sn}
+    </select>
 
 </mapper>

+ 4 - 3
hx-purchase/src/main/java/com/fjhx/purchase/service/arrival/impl/ArrivalServiceImpl.java

@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.common.enums.CodingRuleEnum;
 import com.fjhx.common.service.coding.CodingRuleService;
+import com.fjhx.common.utils.Assert;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.kd100.entity.company.po.CompanyInfo;
 import com.fjhx.kd100.service.company.CompanyInfoService;
@@ -178,9 +179,9 @@ public class ArrivalServiceImpl extends ServiceImpl<ArrivalMapper, Arrival> impl
         if(ObjectUtil.isEmpty(arrival.getPurchaseId())){
             throw new ServiceException("采购id不能为空");
         }
-        if(ObjectUtil.isEmpty(arrival.getSupplyId())){
-            throw new ServiceException("供应商id不能为空");
-        }
+        Purchase purchase0 = purchaseService.getById(arrival.getPurchaseId());
+        Assert.notEmpty(purchase0,"无法获取到采购信息");
+        arrival.setSupplyId(purchase0.getSupplyId());
         arrival.setCode(codingRuleService.createCode(CodingRuleEnum.ARRIVAL.getKey(),null));
 //        arrival.setCode(CodeEnum.ARRIVAL.getCode());
         arrival.setStatus(1);//设置到货