liweidong-hj 3 weeks ago
commit 6475c6d01b
  1. 13
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/entity/OemStatementEntity.java
  2. 108
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/excel/OemStatementExcel.java
  3. 10
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/request/PriceSheetQuery.java
  4. 6
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/request/StatementQuery.java
  5. 28
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/vo/StatementVO.java
  6. 11
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/feign/IOrderClient.java
  7. 3
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/vo/ProduceMonitorPlanDataVO.java
  8. 6
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/WorkPlanItemDetailVO.java
  9. 2
      blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/YieldOrderEntity.java
  10. 3
      blade-service/blade-desk/src/main/java/org/springblade/desk/efficiency/mapper/EfficiencyTaskMapper.xml
  11. 118
      blade-service/blade-desk/src/main/java/org/springblade/desk/oem/controller/OemStatementController.java
  12. 14
      blade-service/blade-desk/src/main/java/org/springblade/desk/oem/mapper/OemStatementMapper.java
  13. 430
      blade-service/blade-desk/src/main/java/org/springblade/desk/oem/mapper/OemStatementMapper.xml
  14. 21
      blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/IOemStatementService.java
  15. 531
      blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/impl/OemStatementServiceImpl.java
  16. 8
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/controller/YieldOrderController.java
  17. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/feign/OrderClient.java
  18. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderService.java
  19. 60
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderServiceImpl.java
  20. 6
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderServiceImpl.java
  21. 30
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/InspectionTaskController.java
  22. 3
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/LiquidTankTaskMapper.xml
  23. 6
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/InspectionTaskServiceImpl.java
  24. 20
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/WorkPlanItemDetailServiceImpl.java
  25. 13
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpDataOemMapper.xml
  26. 3
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java
  27. 5
      blade-service/blade-system/src/main/java/org/springblade/system/controller/UserController.java

@ -10,6 +10,7 @@ import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
import java.io.Serial;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@ -137,4 +138,16 @@ public class OemStatementEntity extends BaseEntity {
@Schema(description = "标准工序代码")
private String standardProcessCode;
@Schema(description = "结算时间")
private Date settleTime;
@Schema(description = "结算时间")
private Date approvalTime;
@Schema(description = "推送时间")
private String pushTime;
@Schema(description = "结算单号")
private String statementNo;
}

@ -1,6 +1,7 @@
package org.springblade.desk.oem.pojo.excel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@ -25,10 +26,9 @@ import java.io.Serializable;
@ContentRowHeight(18)
public class OemStatementExcel implements Serializable {
@ColumnWidth(20)
@ExcelProperty("外协单号")
private String oemCode;
@ExcelProperty("计划单号")
private String ypCode;
@ColumnWidth(20)
@ExcelProperty("车间订单单号")
@ -42,10 +42,6 @@ public class OemStatementExcel implements Serializable {
@ExcelProperty("零件名称")
private String partName;
@ColumnWidth(20)
@ExcelProperty("镀层物料")
private String plateGoodsCode;
@ColumnWidth(20)
@ExcelProperty("批次号")
private String batchNo;
@ -55,11 +51,7 @@ public class OemStatementExcel implements Serializable {
private String prodIdent;
@ColumnWidth(20)
@ExcelProperty("工序编码")
private String psCode;
@ColumnWidth(20)
@ExcelProperty("工序名称")
@ExcelProperty("工序")
private String psName;
@ColumnWidth(20)
@ -67,37 +59,37 @@ public class OemStatementExcel implements Serializable {
private String caName;
@ColumnWidth(20)
@ExcelProperty("镀后入库时间")
private String putStoreTime;
@ExcelProperty("厂商代码")
private String ocCode;
@ColumnWidth(20)
@ExcelProperty("厂商名称")
private String ocName;
@ColumnWidth(20)
@ExcelProperty("生产数量")
@ExcelProperty("结算数量")
private String makeQty;
@ColumnWidth(20)
@ExcelProperty("单面积(dm²)")
@ExcelProperty("单面积(dm²)")
private String ypArea;
@ColumnWidth(20)
@ExcelProperty("总面积(dm²)")
private String totalArea;
@ColumnWidth(20)
@ExcelProperty("外协厂商")
private String ocCode;
@ColumnWidth(20)
@ExcelProperty("外协厂商名称")
private String ocName;
@ColumnWidth(20)
@ExcelProperty("镀种")
private String plate;
@ColumnWidth(20)
@ExcelProperty("镀厚度")
@ExcelProperty("镀层厚度")
private String plateThickness;
@ColumnWidth(20)
@Schema(description = "工序标准代码")
private String standardProcessCode;
@ColumnWidth(20)
@ExcelProperty("涂色标个数")
private String tsbNum;
@ -111,55 +103,43 @@ public class OemStatementExcel implements Serializable {
private String tjtNum;
@ColumnWidth(20)
@ExcelProperty("是否手动结算")
private String manual;
/**
* 镀层厚度
*/
@Schema(description = "计划部门编号")
private String planDeptcode;
@ColumnWidth(20)
@ExcelProperty("镀层厚度")
private BigDecimal rosThickness;
/**
* 结算单价
*/
@Schema(description = "使用部门编号")
private String useDeptCode;
@ColumnWidth(20)
@ExcelProperty("镀后入库时间")
private String putStoreTime;
@ColumnWidth(20)
@Schema(description = "报价单号")
private String quotation;
@ColumnWidth(20)
@Schema(description = "计量单位")
private String unit;
@ColumnWidth(20)
@ExcelProperty("结算单价")
private BigDecimal unitPrice;
/**
* 结算金额
*/
@ColumnWidth(20)
@ExcelProperty("结算金额")
private BigDecimal totalPrice;
/**
* 单位
*/
@ColumnWidth(20)
@ExcelProperty("单位")
private String unit;
/**
* 报价单号
*/
@ExcelProperty("异常原因")
private String memo;
@ColumnWidth(20)
@ExcelProperty("报价单号")
private String quotation;
/**
* 状态
*/
@Schema(description = "结算时间")
private String settleDate;
@ColumnWidth(20)
@ExcelProperty("状态")
@ExcelProperty("结算状态")
private String rosStatusName;
/**
* 状态
*/
@ColumnWidth(20)
@ExcelProperty("审批状态")
private String approvalStatusName;
/**
* 状态
*/
@ColumnWidth(20)
@ExcelProperty("备注")
private String memo;
}

@ -5,6 +5,7 @@ import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.util.List;
/**
* 报价单检索条件
@ -59,4 +60,13 @@ public class PriceSheetQuery {
*/
@Schema(description = "备注")
private String memo;
@Schema(description = "单据状态")
private List<String> validflags;
@Schema(description = "单据类型")
private String papertype;
@Schema(description = "价格类型")
private String pricetype;
}

@ -5,6 +5,7 @@ import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
@ -76,4 +77,9 @@ public class StatementQuery {
*/
@Schema(description = "是否手动结算:0否(自动结算),1是(手动结算)")
private String manual;
/**
* 现执行价格
*/
@Schema(description = "现执行价格")
private BigDecimal price;
}

@ -40,6 +40,9 @@ public class StatementVO extends OemStatementEntity {
@Schema(description = "外协单号")
private String oemCode;
@Schema(description = "计划单号")
private String wpCode;
@Schema(description = "车间订单单号")
private String woCode;
@ -122,4 +125,29 @@ public class StatementVO extends OemStatementEntity {
@Schema(description = "工艺能力类型")
private String wxLimit;
@Schema(description = "工艺能力类型名称")
private String wxLimitName;
@Schema(description = "计划单号")
private String ypCode;
@Schema(description = "责任部门")
private String resDept;
@Schema(description = "使用部门")
private String useDept;
@Schema(description = "使用部门代码")
private String useDeptCode;
@Schema(description = "结算时间")
private String settleDate;
@Schema(description = "审核时间")
private String approvalDate;
@Schema(description = "推送时间")
private String pushDate;
}

@ -4,6 +4,7 @@ import org.springblade.core.launch.constant.AppConstant;
import org.springblade.desk.order.pojo.entity.YieldPlan;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* 模具计划接口声明
@ -22,6 +23,7 @@ public interface IOrderClient {
String INIT_YIELD_ORDER_DAILY_ASSIGN = API_PREFIX + "/initYieldOrderDailyAssign";
String DATA_VERIFY = API_PREFIX + "/dataVerify";
String CREATE_BLB_YIELD_ORDER = API_PREFIX + "/createBlbYieldOrder";
/**
* 生成玻璃饼烧结计划并下达
@ -52,4 +54,13 @@ public interface IOrderClient {
@GetMapping(DATA_VERIFY)
void dataVerify();
/**
* 生成玻璃饼烧结计划并下达
*
* @param yieldPlan
* @return
*/
@GetMapping(CREATE_BLB_YIELD_ORDER)
Boolean createBlbYieldOrder(@RequestParam("partCode")String partCode, @RequestParam("qty")Double qty, @RequestParam("memo")String memo);
}

@ -19,6 +19,9 @@ public class ProduceMonitorPlanDataVO {
@Schema(description = "接收数量")
private Double qualifiedQty;
@Schema(description = "接收人")
private String receiveName;
@Schema(description = "试验数量")
private Double testQty;

@ -3,12 +3,14 @@
*/
package org.springblade.desk.quality.pojo.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.desk.quality.pojo.entity.WorkPlanItemDetail;
import java.io.Serial;
import java.util.Date;
/**
* [工序检验项明细] 视图实体类
@ -27,4 +29,8 @@ public class WorkPlanItemDetailVO extends WorkPlanItemDetail {
@Schema(description = "实际[量具]名称")
private String actMtName ;
@Schema(description = "到期日期(有效日期)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date dueDate;
}

@ -176,7 +176,7 @@ public class YieldOrderEntity extends TenantEntity {
* 优先级-erp中订单优先级
*/
@TableField(value = "PRIORITY_ERP")
private Long priorityErp;
private Integer priorityErp;
/**
* 保管员

@ -100,6 +100,9 @@
<if test="status!=null">
and t.status = #{status}
</if>
<if test="yearMonth!=null">
and t.YEAR_MONTH = #{yearMonth}
</if>
</where>
<choose>
<when test="orderByField != null and orderByField != ''">

@ -116,42 +116,42 @@ public class OemStatementController extends BladeController {
return R.status(mesOemStatementService.deleteLogic(Func.toLongList(ids)));
}
/**
* 外协结算
*/
@PostMapping("/oemSettleAccounts")
@ApiOperationSupport(order = 8)
@Operation(summary = "外协手动结算", description = "")
@ApiLog("外协手动结算")
public R oemManualSettlement(@Valid @RequestBody OemSettleAccountsSave oemSettleAccountsSave) {
return mesOemStatementService.oemManualSettlement(oemSettleAccountsSave.getStatementList(), oemSettleAccountsSave.getPrice());
}
/**
* 外协自动结算
*/
@GetMapping("/autoSettlement")
@ApiOperationSupport(order = 9)
@Operation(summary = "外协自动结算", description = "")
public R autoSettlement(
@Parameter(description = "车间订单号", required = true)
@RequestParam String woCode,
@Parameter(description = "镀后入库日期", required = true) // 添加必填备注
@DateTimeFormat(pattern = "yyyy-MM-dd")
@RequestParam LocalDate date) {
return mesOemStatementService.autoSettlement(woCode, date);
}
/**
* 外协预结算-预览
*/
@PostMapping("/preSettlement")
@ApiOperationSupport(order = 10)
@Operation(summary = "外协预结算-预览", description = "")
public R<List<StatementVO>> preSettlement(@Valid @RequestBody OemSettleAccountsSave oemSettleAccountsSave) {
return R.data(mesOemStatementService.preSettlement(oemSettleAccountsSave.getStatementList(), oemSettleAccountsSave.getPrice()));
}
// /**
// * 外协结算
// */
// @PostMapping("/oemSettleAccounts")
// @ApiOperationSupport(order = 8)
// @Operation(summary = "外协手动结算", description = "")
// @ApiLog("外协手动结算")
// public R oemManualSettlement(@Valid @RequestBody OemSettleAccountsSave oemSettleAccountsSave) {
// return mesOemStatementService.oemManualSettlement(oemSettleAccountsSave.getStatementList(), oemSettleAccountsSave.getPrice());
// }
// /**
// * 外协自动结算
// */
// @GetMapping("/autoSettlement")
// @ApiOperationSupport(order = 9)
// @Operation(summary = "外协自动结算", description = "")
// public R autoSettlement(
// @Parameter(description = "车间订单号", required = true)
// @RequestParam String woCode,
//
// @Parameter(description = "镀后入库日期", required = true) // 添加必填备注
// @DateTimeFormat(pattern = "yyyy-MM-dd")
// @RequestParam LocalDate date) {
// return mesOemStatementService.autoSettlement(woCode, date);
// }
// /**
// * 外协预结算-预览
// */
// @PostMapping("/preSettlement")
// @ApiOperationSupport(order = 10)
// @Operation(summary = "外协预结算-预览", description = "")
// public R<List<StatementVO>> preSettlement(@Valid @RequestBody OemSettleAccountsSave oemSettleAccountsSave) {
// return R.data(mesOemStatementService.preSettlement(oemSettleAccountsSave.getStatementList(), oemSettleAccountsSave.getPrice()));
// }
/**
* 外协结算批量审核
@ -193,21 +193,61 @@ public class OemStatementController extends BladeController {
ExcelUtil.export(response, "外协结算单数据" + DateUtil.time(), "外协结算单数据表", excels, OemStatementExcel.class);
}
// /**
// * 外协预结算导出数据
// */
// @PostMapping("/export-preSettlement")
// @ApiOperationSupport(order = 14)
// @Operation(summary = "外协预结算-导出", description = "传入mesOemStatement")
// public void exportPreSettlement(@Valid @RequestBody OemSettleAccountsSave oemSettleAccountsSave, BladeUser bladeUser, HttpServletResponse response) {
// List<StatementVO> list = mesOemStatementService.preSettlement(oemSettleAccountsSave.getStatementList(), oemSettleAccountsSave.getPrice());
// List<OemStatementExcel> excels = new ArrayList<>();
// for (StatementVO statementVO : list) {
// OemStatementExcel excel = new OemStatementExcel();
// BeanUtils.copyProperties(statementVO, excel);
// excels.add(excel);
// }
// ExcelUtil.export(response, "外协预结算单数据" + DateUtil.time(), "外协预结算单数据表", excels, OemStatementExcel.class);
// }
/**
* 外协手动结算
*
* @param mesOemStatement
* @return
*/
@PostMapping("/oemManualSettlement")
@Operation(summary = "手动结算", description = "传入mesOemStatement")
public R oemManualSettlement(@RequestBody StatementQuery mesOemStatement) {
return mesOemStatementService.manualSettlement(mesOemStatement);
}
/**
* 外协预结算导出数据
*/
@PostMapping("/export-preSettlement")
@ApiOperationSupport(order = 14)
@Operation(summary = "外协预结算-导出", description = "传入mesOemStatement")
public void exportPreSettlement(@Valid @RequestBody OemSettleAccountsSave oemSettleAccountsSave, BladeUser bladeUser, HttpServletResponse response) {
List<StatementVO> list = mesOemStatementService.preSettlement(oemSettleAccountsSave.getStatementList(), oemSettleAccountsSave.getPrice());
public void exportPreSettlement(@Valid @RequestBody StatementQuery mesOemStatement, BladeUser bladeUser, HttpServletResponse response) {
List<StatementVO> list = mesOemStatementService.manualPreSettlement(mesOemStatement);
List<OemStatementExcel> excels = new ArrayList<>();
for (StatementVO statementVO : list) {
OemStatementExcel excel = new OemStatementExcel();
BeanUtils.copyProperties(statementVO, excel);
excel.setRosStatusName(statementVO.getRosStatusName());
excels.add(excel);
}
ExcelUtil.export(response, "外协预结算单数据" + DateUtil.time(), "外协预结算单数据表", excels, OemStatementExcel.class);
}
/**
* 匹配标准工序代码
*/
@PostMapping("/matchStandardProcessCode")
@ApiOperationSupport(order = 15)
@Operation(summary = "匹配标准工序代码", description = "批量更新结算异常数据的标准工序代码")
@ApiLog("外协结算 匹配标准工序代码")
public R matchStandardProcessCode() {
return mesOemStatementService.matchStandardProcessCode();
}
}

@ -45,4 +45,18 @@ public interface OemStatementMapper extends BaseMapper<OemStatementEntity> {
*/
List<StatementVO> selectUnsettled(StatementQuery query);
/**
* 查询已结算订单
*
* @param woIds
* @return
*/
List<Long> selectSettledWoIds(@Param("woIds") List<Long> woIds);
/**
* 查询结算异常数据带关联字段
*
* @return List<StatementVO>
*/
List<StatementVO> selectErrorStatements();
}

@ -44,6 +44,10 @@
<result column="ROS_STATUS" property="rosStatus"/>
<result column="APPROVAL_STATUS" property="approvalStatus"/>
<result column="MEMO" property="memo"/>
<result column="SETTLE_TIME" property="settleTime"/>
<result column="APPROVAL_TIME" property="approvalTime"/>
<result column="PUSH_TIME" property="pushTime"/>
<result column="STATEMENT_NO" property="statementNo"/>
<result column="wo_id" property="woId"/>
<result column="oc_id" property="ocId"/>
@ -92,131 +96,134 @@
<result column="REWORK_NO" property="reworkNo"/>
<result column="PLAN_DEPTCODE" property="planDeptcode"/>
<result column="WX_LIMIT" property="wxLimit"/>
<result column="SETTLE_DATE" property="settleDate"/>
<result column="APPROVAL_DATE" property="approvalDate"/>
<result column="PUSH_DATE" property="pushDate"/>
</resultMap>
<select id="selectOemStatementPage" resultMap="StatementVOResultMap">
SELECT
wm_concat(to_char(f.WO_CODE)) as WO_CODE,
wm_concat(to_char(e.PART_CODE)) AS part_code,
d.BATCH_NO,
wm_concat(to_char(e.PRODUCT_IDENT)) AS PROD_IDENT,
-- g.BOP_NAME,
wm_concat(g.MANUAL) AS MANUAL,
wm_concat(to_char(d.PUT_STORE_TIME, 'yyyy-MM-dd')) AS PUT_STORE_TIME,
wm_concat(d.MAKE_QTY) AS MAKE_QTY,
wm_concat(to_char(e.YP_AREA, 'fm99999999999999999990.9999999999')) AS YP_AREA,
sum(d.MAKE_QTY * e.YP_AREA) AS total_area,
c.OC_NAME,
wm_concat(to_char(e.PLATE)) AS PLATE,
wm_concat(to_char(f.ID)) AS wor_id,
wm_concat(to_char(p.plate_thickness)) AS plate_thickness,
d.id as WO_ID,
c.id as OC_ID,
g.id as OP_ID,
a.id as WP_ID,
h.id,
wm_concat(to_char(h.UNIT_PRICE)) AS UNIT_PRICE,
wm_concat(to_char(h.UNIT)) AS UNIT,
wm_concat(to_char(h.TOTAL_PRICE)) AS TOTAL_PRICE,
wm_concat(to_char(h.QUOTATION)) AS QUOTATION,
wm_concat(to_char(h.MEMO)) AS MEMO,
wm_concat(to_char(h.APPROVAL_STATUS)) AS APPROVAL_STATUS,
MAX( h.UPDATE_TIME) AS UPDATE_TIME,
wm_concat(to_char(NVL(h.ROS_STATUS, 1))) AS ROS_STATUS,
wm_concat(to_char(p.plate_code)) AS plate_code,
wm_concat(to_char(p.plate_goods_code)) AS plate_goods_code,
c.code as OC_CODE,
a.HOUR_QUOTA,
wm_concat(to_char(a.scrap_qty)) AS scrap_qty,
wm_concat(to_char(a.loss_qty)) AS loss_qty,
wm_concat(to_char(a.test_qty)) AS test_qty,
wm_concat(to_char(p.tsb_num)) AS tsb_num,
wm_concat(to_char(p.tsd_num)) AS tsd_num,
wm_concat(to_char(p.tjt_num)) AS tjt_num,
e.yo_code,
b.code AS ps_code,
b.name AS ps_name,
i.ca_name,
wm_concat(to_char(p.part_name)) AS part_name,
wm_concat(to_char(h.ros_thickness)) AS ros_thickness,
e.use_dept,
wm_concat(to_char(h.id)) AS ros_id
FROM MES_WORK_PLAN a
INNER JOIN BS_PROCESS_SET b on a.PPS_ID = b.ID
INNER JOIN MES_OEM_PROCESS g ON b.ID = g.PROCESS_ID
INNER JOIN BS_OEM c on a.OC_ID = c.ID
INNER JOIN MES_WORK_ORDER d on a.WO_ID = d.ID
INNER JOIN MES_YIELD_ORDER e on d.YO_ID = e.ID
INNER JOIN MES_WORK_ORDER_RUN f on d.WOR_ID = f.ID
INNER JOIN DS_PART p ON e.PART_CODE = p.PART_CODE
LEFT JOIN MES_OEM_STATEMENT h ON h.WP_ID = a.ID
INNER JOIN BS_CRAFT_ABILITY I on I.ID = a.CA_ID
WHERE d.PUT_STORE_TIME is not null
/*AND (g.craft_ids like '%'||i.ID||'%' or g.craft_ids is null)
and ((g.bop_name in ('浸保护剂','除镀层','清洗(返修)') and e.po_code not like 'W%') OR g.bop_name not in
('浸保护剂','除镀层','清洗(返修)'))*/
/*AND ((h.ROS_STATUS IS NOT NULL) OR ( a.ID NOT IN ( SELECT WP_ID FROM MES_OEM_STATEMENT)))*/
<choose>
<!-- 查询未结算的记录 -->
<when test="query.rosStatusList != null and query.rosStatusList.contains(&quot;1&quot;)">
AND a.ID NOT IN ( SELECT WP_ID FROM MES_OEM_STATEMENT)
</when>
<!-- 查询已结算状态的记录 -->
<when test="query.rosStatusList != null and query.rosStatusList != ''">
AND h.ROS_STATUS IN
<foreach collection="query.rosStatusList.split(',')" item="status"
open="(" separator="," close=")" index="index">
#{status}
</foreach>
</when>
</choose>
<!-- 动态条件拼接 -->
<if test="query.postPlatingStorageTimeStart != null">
AND d.PUT_STORE_TIME &gt;= #{query.postPlatingStorageTimeStart}
</if>
<if test="query.postPlatingStorageTimeEnd != null">
AND d.PUT_STORE_TIME &lt; #{query.postPlatingStorageTimeEnd} + 1
</if>
<if test="query.prodIdent != null and query.prodIdent != ''">
AND e.PRODUCT_IDENT = #{query.prodIdent}
</if>
<if test="query.manual != null and query.manual != ''">
AND g.manual = #{query.manual}
</if>
<if test="query.woCode != null and query.woCode != ''">
AND (f.WO_CODE LIKE CONCAT('%', CONCAT(#{query.woCode}, '%')) OR d.WO_CODE LIKE CONCAT('%',
CONCAT(#{query.woCode}, '%')))
</if>
<if test="query.partCode != null and query.partCode != ''">
AND e.PART_CODE LIKE CONCAT('%', CONCAT(#{query.partCode}, '%'))
</if>
<if test="query.batchNo != null and query.batchNo != ''">
AND d.BATCH_NO LIKE CONCAT('%', CONCAT(#{query.batchNo}, '%'))
</if>
<if test="query.ocIds != null and query.ocIds != ''">
AND c.ID IN
<foreach collection="query.ocIds.split(',')" item="id"
open="(" separator="," close=")" index="index">
#{id}
</foreach>
</if>
<if test="query.psCode != null and query.psCode != ''">
AND g.oem_process_code IN
<foreach collection="query.psCode.split(',')" item="id"
open="(" separator="," close=")" index="index">
#{id}
</foreach>
</if>
<if test="query.approvalStatusList != null and query.approvalStatusList != ''">
AND h.APPROVAL_STATUS IN
<foreach collection="query.approvalStatusList.split(',')" item="status"
open="(" separator="," close=")" index="index">
#{status}
</foreach>
</if>
GROUP BY g.PROCESS_ID, a.ID, c.OC_NAME, c.ID, g.ID, d.ID, d.BATCH_NO, c.CODE, a.HOUR_QUOTA, e.yo_code,
i.ca_name, e.use_dept,b.name,b.code,h.id
</select>
<!-- <select id="selectOemStatementPage" resultMap="StatementVOResultMap">-->
<!-- SELECT-->
<!-- wm_concat(to_char(f.WO_CODE)) as WO_CODE,-->
<!-- wm_concat(to_char(e.PART_CODE)) AS part_code,-->
<!-- d.BATCH_NO,-->
<!-- wm_concat(to_char(e.PRODUCT_IDENT)) AS PROD_IDENT,-->
<!-- &#45;&#45; g.BOP_NAME,-->
<!-- wm_concat(g.MANUAL) AS MANUAL,-->
<!-- wm_concat(to_char(d.PUT_STORE_TIME, 'yyyy-MM-dd')) AS PUT_STORE_TIME,-->
<!-- wm_concat(d.MAKE_QTY) AS MAKE_QTY,-->
<!-- wm_concat(to_char(e.YP_AREA, 'fm99999999999999999990.9999999999')) AS YP_AREA,-->
<!-- sum(d.MAKE_QTY * e.YP_AREA) AS total_area,-->
<!-- c.OC_NAME,-->
<!-- wm_concat(to_char(e.PLATE)) AS PLATE,-->
<!-- wm_concat(to_char(f.ID)) AS wor_id,-->
<!-- wm_concat(to_char(p.plate_thickness)) AS plate_thickness,-->
<!-- d.id as WO_ID,-->
<!-- c.id as OC_ID,-->
<!-- g.id as OP_ID,-->
<!-- a.id as WP_ID,-->
<!-- h.id,-->
<!-- wm_concat(to_char(h.UNIT_PRICE)) AS UNIT_PRICE,-->
<!-- wm_concat(to_char(h.UNIT)) AS UNIT,-->
<!-- wm_concat(to_char(h.TOTAL_PRICE)) AS TOTAL_PRICE,-->
<!-- wm_concat(to_char(h.QUOTATION)) AS QUOTATION,-->
<!-- wm_concat(to_char(h.MEMO)) AS MEMO,-->
<!-- wm_concat(to_char(h.APPROVAL_STATUS)) AS APPROVAL_STATUS,-->
<!-- MAX( h.UPDATE_TIME) AS UPDATE_TIME,-->
<!-- wm_concat(to_char(NVL(h.ROS_STATUS, 1))) AS ROS_STATUS,-->
<!-- wm_concat(to_char(p.plate_code)) AS plate_code,-->
<!-- wm_concat(to_char(p.plate_goods_code)) AS plate_goods_code,-->
<!-- c.code as OC_CODE,-->
<!-- a.HOUR_QUOTA,-->
<!-- wm_concat(to_char(a.scrap_qty)) AS scrap_qty,-->
<!-- wm_concat(to_char(a.loss_qty)) AS loss_qty,-->
<!-- wm_concat(to_char(a.test_qty)) AS test_qty,-->
<!-- wm_concat(to_char(p.tsb_num)) AS tsb_num,-->
<!-- wm_concat(to_char(p.tsd_num)) AS tsd_num,-->
<!-- wm_concat(to_char(p.tjt_num)) AS tjt_num,-->
<!-- e.yo_code,-->
<!-- b.code AS ps_code,-->
<!-- b.name AS ps_name,-->
<!-- i.ca_name,-->
<!-- wm_concat(to_char(p.part_name)) AS part_name,-->
<!-- wm_concat(to_char(h.ros_thickness)) AS ros_thickness,-->
<!-- e.use_dept,-->
<!-- wm_concat(to_char(h.id)) AS ros_id-->
<!-- FROM MES_WORK_PLAN a-->
<!-- INNER JOIN BS_PROCESS_SET b on a.PPS_ID = b.ID-->
<!-- INNER JOIN MES_OEM_PROCESS g ON b.ID = g.PROCESS_ID-->
<!-- INNER JOIN BS_OEM c on a.OC_ID = c.ID-->
<!-- INNER JOIN MES_WORK_ORDER d on a.WO_ID = d.ID-->
<!-- INNER JOIN MES_YIELD_ORDER e on d.YO_ID = e.ID-->
<!-- INNER JOIN MES_WORK_ORDER_RUN f on d.WOR_ID = f.ID-->
<!-- INNER JOIN DS_PART p ON e.PART_CODE = p.PART_CODE-->
<!-- LEFT JOIN MES_OEM_STATEMENT h ON h.WP_ID = a.ID-->
<!-- INNER JOIN BS_CRAFT_ABILITY I on I.ID = a.CA_ID-->
<!-- WHERE d.PUT_STORE_TIME is not null-->
<!-- /*AND (g.craft_ids like '%'||i.ID||'%' or g.craft_ids is null)-->
<!-- and ((g.bop_name in ('浸保护剂','除镀层','清洗(返修)') and e.po_code not like 'W%') OR g.bop_name not in-->
<!-- ('浸保护剂','除镀层','清洗(返修)'))*/-->
<!-- /*AND ((h.ROS_STATUS IS NOT NULL) OR ( a.ID NOT IN ( SELECT WP_ID FROM MES_OEM_STATEMENT)))*/-->
<!-- <choose>-->
<!-- &lt;!&ndash; 查询未结算的记录 &ndash;&gt;-->
<!-- <when test="query.rosStatusList != null and query.rosStatusList.contains(&quot;1&quot;)">-->
<!-- AND a.ID NOT IN ( SELECT WP_ID FROM MES_OEM_STATEMENT)-->
<!-- </when>-->
<!-- &lt;!&ndash; 查询已结算状态的记录 &ndash;&gt;-->
<!-- <when test="query.rosStatusList != null and query.rosStatusList != ''">-->
<!-- AND h.ROS_STATUS IN-->
<!-- <foreach collection="query.rosStatusList.split(',')" item="status"-->
<!-- open="(" separator="," close=")" index="index">-->
<!-- #{status}-->
<!-- </foreach>-->
<!-- </when>-->
<!-- </choose>-->
<!-- &lt;!&ndash; 动态条件拼接 &ndash;&gt;-->
<!-- <if test="query.postPlatingStorageTimeStart != null">-->
<!-- AND d.PUT_STORE_TIME &gt;= #{query.postPlatingStorageTimeStart}-->
<!-- </if>-->
<!-- <if test="query.postPlatingStorageTimeEnd != null">-->
<!-- AND d.PUT_STORE_TIME &lt; #{query.postPlatingStorageTimeEnd} + 1-->
<!-- </if>-->
<!-- <if test="query.prodIdent != null and query.prodIdent != ''">-->
<!-- AND e.PRODUCT_IDENT = #{query.prodIdent}-->
<!-- </if>-->
<!-- <if test="query.manual != null and query.manual != ''">-->
<!-- AND g.manual = #{query.manual}-->
<!-- </if>-->
<!-- <if test="query.woCode != null and query.woCode != ''">-->
<!-- AND (f.WO_CODE LIKE CONCAT('%', CONCAT(#{query.woCode}, '%')) OR d.WO_CODE LIKE CONCAT('%',-->
<!-- CONCAT(#{query.woCode}, '%')))-->
<!-- </if>-->
<!-- <if test="query.partCode != null and query.partCode != ''">-->
<!-- AND e.PART_CODE LIKE CONCAT('%', CONCAT(#{query.partCode}, '%'))-->
<!-- </if>-->
<!-- <if test="query.batchNo != null and query.batchNo != ''">-->
<!-- AND d.BATCH_NO LIKE CONCAT('%', CONCAT(#{query.batchNo}, '%'))-->
<!-- </if>-->
<!-- <if test="query.ocIds != null and query.ocIds != ''">-->
<!-- AND c.ID IN-->
<!-- <foreach collection="query.ocIds.split(',')" item="id"-->
<!-- open="(" separator="," close=")" index="index">-->
<!-- #{id}-->
<!-- </foreach>-->
<!-- </if>-->
<!-- <if test="query.psCode != null and query.psCode != ''">-->
<!-- AND g.oem_process_code IN-->
<!-- <foreach collection="query.psCode.split(',')" item="id"-->
<!-- open="(" separator="," close=")" index="index">-->
<!-- #{id}-->
<!-- </foreach>-->
<!-- </if>-->
<!-- <if test="query.approvalStatusList != null and query.approvalStatusList != ''">-->
<!-- AND h.APPROVAL_STATUS IN-->
<!-- <foreach collection="query.approvalStatusList.split(',')" item="status"-->
<!-- open="(" separator="," close=")" index="index">-->
<!-- #{status}-->
<!-- </foreach>-->
<!-- </if>-->
<!-- GROUP BY g.PROCESS_ID, a.ID, c.OC_NAME, c.ID, g.ID, d.ID, d.BATCH_NO, c.CODE, a.HOUR_QUOTA, e.yo_code,-->
<!-- i.ca_name, e.use_dept,b.name,b.code,h.id-->
<!-- </select>-->
<select id="exportOemStatement" resultType="org.springblade.desk.oem.pojo.excel.OemStatementExcel">
@ -238,6 +245,7 @@
d.wo_code,
to_char(d.PUT_STORE_TIME, 'yyyy-MM-dd') AS PUT_STORE_TIME,
d.MAKE_QTY,
d.MAKE_QTY * e.YP_AREA AS total_area,
e.PLATE_THICKNESS1 as ROS_THICKNESS,
e.PLATE_THICKNESS1 as PLATE_THICKNESS,
e.PLAN_DEPTCODE,
@ -248,17 +256,22 @@
e.tsd_num AS tsd_num,
e.tjt_num AS tjt_num,
e.YP_AREA AS YP_AREA,
d.MAKE_QTY * e.YP_AREA AS total_area,
e.YP_CODE as YP_CODE,
e.RES_DEPT as RES_DEPT,
e.USE_DEPT as USE_DEPT,
e.USE_DEPT_CODE AS USE_DEPT_CODE,
g.manual,
g.CRAFT_IDS,
i.WX_LIMIT,
p.part_name
p.part_name,
h.id
FROM
MES_WORK_PLAN a
INNER JOIN BS_PROCESS_SET b ON a.PPS_ID = b.ID AND b.IS_DELETED = 0
INNER JOIN BS_OEM c ON a.OC_ID = c.ID AND c.IS_DELETED = 0
INNER JOIN MES_WORK_ORDER d ON a.WO_ID = d.ID AND d.IS_DELETED = 0
INNER JOIN MES_YIELD_ORDER e ON d.YO_ID = e.ID AND e.IS_DELETED = 0
INNER JOIN MES_WORK_ORDER_RUN f on d.WOR_ID = f.ID AND f.IS_DELETED = 0
INNER JOIN MES_OEM_PROCESS g ON b.ID = g.PROCESS_ID AND g.IS_DELETED = 0
LEFT JOIN MES_OEM_STATEMENT h ON h.WP_ID = a.ID AND h.IS_DELETED = 0
INNER JOIN BS_CRAFT_ABILITY i ON i.ID = a.CA_ID AND i.IS_DELETED = 0
@ -269,33 +282,148 @@
<if test="postPlatingStorageTimeStart != null">
AND d.PUT_STORE_TIME &gt;= #{postPlatingStorageTimeStart}
</if>
<if test="woCode != null and woCode != ''">
AND (f.WO_CODE LIKE CONCAT('%', CONCAT(#{woCode}, '%')) OR d.WO_CODE LIKE CONCAT('%', CONCAT(#{woCode}, '%')))
</if>
</where>
</select>
<select id="selectSettledWoIds" resultType="java.lang.Long">
SELECT DISTINCT wp.WO_ID
FROM MES_WORK_PLAN wp
INNER JOIN MES_OEM_STATEMENT os
ON os.WP_ID = wp.ID
WHERE
wp.WO_ID IN
<foreach collection="woIds" item="woId" open="(" separator="," close=")">
#{woId}
</foreach>
AND os.ROS_STATUS = 4
</select>
<select id="selectOemStatementPage" resultMap="StatementVOResultMap">
SELECT
h.ID,
e.YP_CODE,
d.WO_CODE,
e.PART_CODE,
p.PART_NAME,
e.BATCH_NO,
e.PRODUCT_IDENT as PROD_IDENT,
b.NAME as PS_NAME,
i.CA_NAME,
c.CODE as OC_CODE,
c.OC_NAME,
d.MAKE_QTY,
e.YP_AREA,
d.MAKE_QTY * e.YP_AREA as TOTAL_AREA,
e.PLATE,
e.PLATE_THICKNESS1 as PLATE_THICKNESS,
h.ROS_THICKNESS,
h.STANDARD_PROCESS_CODE,
e.TSB_NUM,
e.TSD_NUM,
e.TJT_NUM,
e.PLAN_DEPTCODE,
e.USE_DEPT_CODE,
to_char(d.PUT_STORE_TIME, 'yyyy-MM-dd') as PUT_STORE_TIME,
h.QUOTATION,
h.UNIT,
h.UNIT_PRICE,
h.TOTAL_PRICE,
h.MEMO,
to_char(h.SETTLE_TIME, 'yyyy-MM-dd') as SETTLE_DATE,
h.ROS_STATUS,
to_char(h.APPROVAL_TIME, 'yyyy-MM-dd') as APPROVAL_DATE,
to_char(h.PUSH_TIME, 'yyyy-MM-dd') as PUSH_DATE,
h.STATEMENT_NO
FROM MES_OEM_STATEMENT h
INNER JOIN MES_WORK_PLAN a ON h.WP_ID = a.ID AND a.IS_DELETED = 0
INNER JOIN BS_PROCESS_SET b ON a.PPS_ID = b.ID AND b.IS_DELETED = 0
INNER JOIN BS_OEM c ON a.OC_ID = c.ID AND c.IS_DELETED = 0
INNER JOIN MES_WORK_ORDER d ON a.WO_ID = d.ID AND d.IS_DELETED = 0
INNER JOIN MES_YIELD_ORDER e ON d.YO_ID = e.ID AND e.IS_DELETED = 0
INNER JOIN MES_WORK_ORDER_RUN f on d.WOR_ID = f.ID AND f.IS_DELETED = 0
INNER JOIN MES_OEM_PROCESS g ON b.ID = g.PROCESS_ID AND g.IS_DELETED = 0
INNER JOIN BS_CRAFT_ABILITY i ON i.ID = a.CA_ID AND i.IS_DELETED = 0
INNER JOIN DS_PART_VERSION pv ON e.part_code = pv.part_code AND e.part_version = pv.part_version AND pv.IS_DELETED = 0
INNER JOIN DS_PART p ON pv.PART_ID = p.ID AND p.IS_DELETED = 0
<where>
h.IS_DELETED = 0
<if test="query.rosStatusList != null and query.rosStatusList != ''">
AND h.ROS_STATUS IN
<foreach collection="query.rosStatusList.split(',')" item="status"
open="(" separator="," close=")" index="index">
#{status}
</foreach>
</if>
<if test="query.postPlatingStorageTimeStart != null">
AND d.PUT_STORE_TIME &gt;= #{query.postPlatingStorageTimeStart}
</if>
<if test="query.postPlatingStorageTimeEnd != null">
AND d.PUT_STORE_TIME &lt; #{query.postPlatingStorageTimeEnd} + 1
</if>
<if test="query.prodIdent != null and query.prodIdent != ''">
AND e.PRODUCT_IDENT = #{query.prodIdent}
</if>
<if test="query.manual != null and query.manual != ''">
AND g.manual = #{query.manual}
</if>
<if test="query.woCode != null and query.woCode != ''">
AND (f.WO_CODE LIKE CONCAT('%', CONCAT(#{query.woCode}, '%')) OR d.WO_CODE LIKE CONCAT('%',
CONCAT(#{query.woCode}, '%')))
</if>
<if test="query.partCode != null and query.partCode != ''">
AND e.PART_CODE LIKE CONCAT('%', CONCAT(#{query.partCode}, '%'))
</if>
<if test="query.batchNo != null and query.batchNo != ''">
AND d.BATCH_NO LIKE CONCAT('%', CONCAT(#{query.batchNo}, '%'))
</if>
<if test="query.ocIds != null and query.ocIds != ''">
AND c.ID IN
<foreach collection="query.ocIds.split(',')" item="id"
open="(" separator="," close=")" index="index">
#{id}
</foreach>
</if>
<if test="query.psCode != null and query.psCode != ''">
AND g.oem_process_code IN
<foreach collection="query.psCode.split(',')" item="id"
open="(" separator="," close=")" index="index">
#{id}
</foreach>
</if>
<if test="query.approvalStatusList != null and query.approvalStatusList != ''">
AND h.APPROVAL_STATUS IN
<foreach collection="query.approvalStatusList.split(',')" item="status"
open="(" separator="," close=")" index="index">
#{status}
</foreach>
</if>
</where>
GROUP BY
a.id,
a.wo_id,
a.OC_ID,
a.pps_id,
a.ca_id,
b.name,
c.code,
d.REWORK_CODE,
d.REWORK_NO,
d.wo_code,
d.PUT_STORE_TIME,
d.MAKE_QTY,
e.PLATE_THICKNESS1,
e.PLAN_DEPTCODE,
e.plate,
e.PART_CODE,
e.PRODUCT_IDENT,
e.tsb_num,
e.tsd_num,
e.tjt_num,
e.YP_AREA,
g.manual,
g.CRAFT_IDS,
i.WX_LIMIT,
p.part_name
order by PUT_STORE_TIME desc
</select>
<!-- 查询结算异常数据(带关联字段) -->
<select id="selectErrorStatements" resultMap="StatementVOResultMap">
SELECT
h.ID,
a.pps_id as ps_id,
e.PART_CODE,
p.PART_NAME,
e.PLATE,
e.PLATE_THICKNESS1 as PLATE_THICKNESS,
h.ROS_STATUS,
h.MEMO,
h.STANDARD_PROCESS_CODE
FROM MES_OEM_STATEMENT h
INNER JOIN MES_WORK_PLAN a ON h.WP_ID = a.ID AND a.IS_DELETED = 0
INNER JOIN BS_PROCESS_SET b ON a.PPS_ID = b.ID AND b.IS_DELETED = 0
INNER JOIN MES_WORK_ORDER d ON a.WO_ID = d.ID AND d.IS_DELETED = 0
INNER JOIN MES_YIELD_ORDER e ON d.YO_ID = e.ID AND e.IS_DELETED = 0
INNER JOIN DS_PART_VERSION pv ON e.part_code = pv.part_code AND e.part_version = pv.part_version AND pv.IS_DELETED = 0
INNER JOIN DS_PART p ON pv.PART_ID = p.ID AND p.IS_DELETED = 0
WHERE h.IS_DELETED = 0
AND h.ROS_STATUS = 3
</select>
</mapper>

@ -45,7 +45,6 @@ public interface IOemStatementService extends BaseService<OemStatementEntity> {
*
* @param statementVOS 结算单以车间执行计划为主表
* @param price 金价
* @param putStoreDate 镀后入库时间
* @return
*/
R oemManualSettlement(List<StatementVO> statementVOS, BigDecimal price);
@ -87,6 +86,24 @@ public interface IOemStatementService extends BaseService<OemStatementEntity> {
/**
* 生成结算数据
*/
void generateSettlement();
R generateSettlement();
/**
* 手动结算
*
* @param mesOemStatement
* @return
*/
R manualSettlement(StatementQuery mesOemStatement);
/**
* 手动预结算
*
* @param mesOemStatement
* @return
*/
List<StatementVO> manualPreSettlement(StatementQuery mesOemStatement);
R matchStandardProcessCode();
}

@ -1,6 +1,7 @@
package org.springblade.desk.oem.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@ -33,6 +34,7 @@ import org.springblade.desk.oem.service.IOemStatementTaskLogService;
import org.springblade.desk.util.PriceMatcher;
import org.springblade.erpdata.feign.IErpDataOemClient;
import org.springblade.system.feign.IDictBizClient;
import org.springblade.system.pojo.entity.DictBiz;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
@ -549,16 +551,30 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
}
UpdateWrapper<OemStatementEntity> updateWrapper = new UpdateWrapper<>();
/**
* 2026/5/15
* 审核不通过结算状态更新为结算异常-异常原因MES结算审核不通过
* 审核通过结算状态更新为待推送
* */
if (3 == oemSettleAccountsApproval.getApprovalStatus()) {
//审核通过
updateWrapper.set("approval_status", OemStatementEntity.APPROVAL_STATUS_VIA).set("memo", "外协结算完成").set("ros_status", OemStatementEntity.OK_SETTLEMENT).in("id", ids);
updateWrapper.set("approval_status", OemStatementEntity.APPROVAL_STATUS_VIA)
.set("memo", "外协结算完成")
.set("ros_status", OemStatementEntity.OK_SETTLEMENT)
.in("id", ids);
} else {
//审核不通过:(1)原因为不需要结算的更新为【无需结算】(2)原因是基础数据有误的更新为【结算异常】
if (1 == oemSettleAccountsApproval.getReason()) {
updateWrapper.set("approval_status", OemStatementEntity.APPROVAL_STATUS_VIA).set("memo", "无需结算").set("total_price", null).set("unit_price", null).set("quotation", "").set("ros_status", OemStatementEntity.NOT_NEED_SETTLEMENT).in("id", ids);
updateWrapper.set("approval_status", OemStatementEntity.APPROVAL_STATUS_VIA)
.set("memo", "无需结算").set("total_price", null).set("unit_price", null)
.set("quotation", "")
.set("ros_status", OemStatementEntity.NOT_NEED_SETTLEMENT)
.in("id", ids);
} else {
updateWrapper.set("approval_status", OemStatementEntity.APPROVAL_STATUS_FAIL).set("memo", "基础数据有误").set("ros_status", OemStatementEntity.ERR_SETTLEMENT).in("id", ids);
updateWrapper.set("approval_status", OemStatementEntity.APPROVAL_STATUS_FAIL)
.set("memo", "基础数据有误")
.set("ros_status", OemStatementEntity.ERR_SETTLEMENT)
.in("id", ids);
}
}
@ -568,18 +584,20 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
@Override
public R notNeedSettlement(List<StatementVO> list) {
if (null != list && list.size() > 0) {
List<OemStatementEntity> saves = list.stream().map(statementVO -> {
OemStatementEntity entity = new OemStatementEntity();
BeanUtils.copyProperties(statementVO, entity);
entity.setApprovalStatus(OemStatementEntity.APPROVAL_STATUS_VIA);
entity.setRosStatus(OemStatementEntity.NOT_NEED_SETTLEMENT);
entity.setMemo("无需结算");
entity.setTotalPrice(null);
entity.setUnitPrice(null);
entity.setQuotation("");
entity.setUpdateTime(new Date());
return entity;
}).collect(Collectors.toList());
List<OemStatementEntity> saves = list.stream()
.map(statementVO -> {
OemStatementEntity entity = new OemStatementEntity();
BeanUtils.copyProperties(statementVO, entity);
entity.setApprovalStatus(OemStatementEntity.APPROVAL_STATUS_VIA);
entity.setRosStatus(OemStatementEntity.ERR_SETTLEMENT);
entity.setMemo("无需结算");
entity.setTotalPrice(null);
entity.setUnitPrice(null);
entity.setQuotation("");
entity.setUpdateTime(new Date());
return entity;
})
.collect(Collectors.toList());
// baseMapper.insertOrUpdate(saves);
// 逐条处理
@ -1188,7 +1206,42 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
}
@Override
public void generateSettlement() {
public R generateSettlement() {
List<OemStatementEntity> saves = new ArrayList<>();
// 查询未生成的结算数据
List<StatementVO> statementVOS = selectUnsettled();
if (CollectionUtils.isEmpty(statementVOS)) {
return R.fail("没有需要结算的记录");
}
// 处理重复镀后入库
statementVOS = duplicatePutStore(statementVOS, saves);
// 处理不结算数据
statementVOS = noSettlement(statementVOS);
if (CollectionUtils.isEmpty(statementVOS)) {
return R.fail("没有需要结算的记录");
}
// 匹配标准工序代码
matchStandardProcess(statementVOS);
// 结算处理
settlementProcess(statementVOS, saves);
if (CollectionUtils.isEmpty(saves)) {
return R.fail("没有需要结算的记录");
}
// 获取最大镀后入库时间
Date maxPutStoreTimeDate = getMaxPutStoreTimeDate(statementVOS);
// 记录结算数据
this.saveOrUpdateBatch(saves);
// 记录结算日志
oemStatementTaskLogService.saveMaxPutStoreTime(maxPutStoreTimeDate);
return R.success();
}
/**
* 查询未生成的结算数据
*
* @return
*/
private List<StatementVO> selectUnsettled() {
StatementQuery query = new StatementQuery();
Date lastMaxPutStoreTime = oemStatementTaskLogService.getLastMaxPutStoreTime();
if (lastMaxPutStoreTime != null) {
@ -1196,16 +1249,84 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
.atZone(ZoneId.systemDefault())
.toLocalDate());
}
List<StatementVO> statementVOS = baseMapper.selectUnsettled(query);
if (CollectionUtils.isEmpty(statementVOS)) {
return;
}
return baseMapper.selectUnsettled(query);
}
/**
* 查询工艺能力类型
*
* @return
*/
private Map<String, String> getProcessCapabilityTypeMap() {
Map<String, String> dictMap = new HashMap<>();
R<List<DictBiz>> RProcessCapabilityType = dictBizClient.getList("ProcessCapabilityType");
if (RProcessCapabilityType.isSuccess()) {
List<DictBiz> dictList = RProcessCapabilityType.getData();
dictMap = dictList.stream()
.collect(Collectors.toMap(
DictBiz::getDictKey,
DictBiz::getDictValue,
(oldVal, newVal) -> oldVal
));
}
return dictMap;
}
/**
* 处理重复镀后入库
*
* @return
*/
private List<StatementVO> duplicatePutStore(List<StatementVO> statementVOS, List<OemStatementEntity> saves) {
// 校验车间订单工序是否存在结算数据
List<Long> woIds = statementVOS.stream()
.filter(vo -> vo.getId() != null)
.map(StatementVO::getWoId)
.filter(woId -> woId != null)
.collect(Collectors.toList());
// 查询存在已结算数据的订单
List<Long> settledWoIds = baseMapper.selectSettledWoIds(woIds);
// 存在已结算数据的订单跳过,不存在已结算数据的订单标记为重复镀后入库
statementVOS = statementVOS.stream()
.filter(vo -> {
boolean needRemove = vo.getId() != null
&& vo.getWoId() != null
&& settledWoIds.contains(vo.getWoId());
return !needRemove;
})
.map(vo -> {
if (vo.getId() != null) {
OemStatementEntity entity = new OemStatementEntity();
entity.setId(vo.getId());
entity.setRosStatus(OemStatementEntity.ERR_SETTLEMENT);
entity.setMemo("重复镀后入库");
saves.add(entity);
vo.setId(null); // 清空ID
}
return vo;
})
.collect(Collectors.toList());
return statementVOS;
}
/**
* 处理不结算数据
*
* @param statementVOS
* @return
*/
private List<StatementVO> noSettlement(List<StatementVO> statementVOS) {
List<StatementVO> settlementVOs = new ArrayList<>();
// 查询工艺能力类型
Map<String, String> dictMap = getProcessCapabilityTypeMap();
for (StatementVO statementVO : statementVOS) {
statementVO.setWxLimitName(dictMap.get(statementVO.getWxLimit()));
boolean isRework = !StringUtils.isEmpty(statementVO.getReworkCode()) && !StringUtils.isEmpty(statementVO.getReworkNo());
boolean isFj = statementVO.getWoCode() != null && statementVO.getWoCode().startsWith("FJ");
// TODO 如果是返工订单,审理单对应责任部门为3400,不结算
if (isRework && DEPT_CODE_REWORK.equals(statementVO.getPlanDeptcode())) {
boolean isFj = statementVO.getYpCode() != null && statementVO.getYpCode().startsWith("FJ");
boolean isDjDy = !StringUtils.isEmpty(statementVO.getWxLimitName()) && (statementVO.getWxLimitName().contains("镀金") || statementVO.getWxLimitName().contains("镀银"));
boolean checkPs = "浸保护剂".equals(statementVO.getPsName()) || "除镀层".equals(statementVO.getPsName()) || "清洗(返工)".equals(statementVO.getPsName());
// 如果是返工订单,审理单对应责任部门为3400,不结算
if (isRework && DEPT_CODE_REWORK.equals(statementVO.getResDept())) {
continue;
}
// 工序加工单位非外协厂家,不结算
@ -1223,89 +1344,60 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
if (!isContain) {
continue;
}
// TODO 如果工序为【浸保护剂、除镀层、清洗(返工)】:只计算返工订单 或 计划单号以“FJ”开头的订单(即:既不是返工单也不是以FJ开头的订单,不结算)
if ("浸保护剂".equals(statementVO.getPsName()) || "除镀层".equals(statementVO.getPsName()) || "清洗(返工)".equals(statementVO.getPsName())) {
// 如果工序为【浸保护剂、除镀层、清洗(返工)】:只计算返工订单 或 计划单号以“FJ”开头的订单(即:既不是返工单也不是以FJ开头的订单,不结算)
if (checkPs) {
boolean isNormalOrder = !isRework && !isFj;
if (isNormalOrder) {
continue;
}
}
// TODO 如果车间订单为【返工订单】并且工序对应工艺能力类型包含“镀金”、“镀银”,不结算
if (isRework) {
if (!StringUtils.isEmpty(statementVO.getWxLimit())) {
R<String> processCapabilityType = dictBizClient.getValue("ProcessCapabilityType", statementVO.getWxLimit());
String type = processCapabilityType.getData();
if (type.contains("镀金") || type.contains("镀银")) {
continue;
}
}
// 如果车间订单为【返工订单】并且工序对应工艺能力类型包含“镀金”、“镀银”,不结算
if (isRework && isDjDy) {
continue;
}
statementVO.setRosStatus(OemStatementEntity.NO_SETTLEMENT);
settlementVOs.add(statementVO);
}
// 匹配标准工序代码
if (CollectionUtils.isNotEmpty(settlementVOs)) {
// 根据工序Id分组
Map<Long, List<StatementVO>> groupByPsId = settlementVOs.stream().collect(Collectors.groupingBy(StatementVO::getPsId));
Set<Long> psIds = groupByPsId.keySet();
final int batchSize = 500;
List<OemStandardProcessEntity> allStandardList = new ArrayList<>();
List<List<Long>> splitPsIds = Lists.partition(new ArrayList<>(psIds), batchSize);
for (List<Long> subPsIds : splitPsIds) {
List<OemStandardProcessEntity> batchList = oemStandardProcessService.list(new LambdaQueryWrapper<OemStandardProcessEntity>().in(OemStandardProcessEntity::getProcessId, subPsIds));
allStandardList.addAll(batchList);
}
Map<Long, List<OemStandardProcessEntity>> standardMap = allStandardList.stream().collect(Collectors.groupingBy(OemStandardProcessEntity::getProcessId));
for (Map.Entry<Long, List<StatementVO>> entry : groupByPsId.entrySet()) {
Long psId = entry.getKey();
List<OemStandardProcessEntity> standardProcessList = standardMap.getOrDefault(psId, Collections.emptyList());
for (StatementVO statementVO : entry.getValue()) {
OemStandardProcessEntity oemStandardProcessEntity = matchStandardProcess(standardProcessList, statementVO);
if (oemStandardProcessEntity != null) {
statementVO.setStandardProcessCode(oemStandardProcessEntity.getStandardProcessCode());
}
}
}
Map<String, List<StatementVO>> groupByManual = settlementVOs.stream().collect(Collectors.groupingBy(StatementVO::getManual));
List<OemStatementEntity> saves = new ArrayList<>();
for (Map.Entry<String, List<StatementVO>> entry : groupByManual.entrySet()) {
String manual = entry.getKey();
// 自动结算
if (MANUAL_AUTO.equals(manual)) {
List<StatementVO> autoStatementVOS = autoSettlement(entry.getValue());
for (StatementVO statementVO : autoStatementVOS) {
OemStatementEntity entity = new OemStatementEntity();
BeanUtils.copyProperties(statementVO, entity);
entity.setUpdateTime(new Date());
entity.setIsDeleted(0);
saves.add(entity);
}
} else {
for (StatementVO statementVO : entry.getValue()) {
OemStatementEntity entity = new OemStatementEntity();
BeanUtils.copyProperties(statementVO, entity);
entity.setUpdateTime(new Date());
entity.setIsDeleted(0);
saves.add(entity);
}
return settlementVOs;
}
/**
* 匹配标准工序代码
*
* @param settlementVOs
*/
private void matchStandardProcess(List<StatementVO> settlementVOs) {
// 根据工序Id分组
Map<Long, List<StatementVO>> groupByPsId = settlementVOs.stream().collect(Collectors.groupingBy(StatementVO::getPsId));
Set<Long> psIds = groupByPsId.keySet();
final int batchSize = 500;
List<OemStandardProcessEntity> allStandardList = new ArrayList<>();
List<List<Long>> splitPsIds = Lists.partition(new ArrayList<>(psIds), batchSize);
for (List<Long> subPsIds : splitPsIds) {
List<OemStandardProcessEntity> batchList = oemStandardProcessService.list(new LambdaQueryWrapper<OemStandardProcessEntity>().in(OemStandardProcessEntity::getProcessId, subPsIds));
allStandardList.addAll(batchList);
}
Map<Long, List<OemStandardProcessEntity>> standardMap = allStandardList.stream().collect(Collectors.groupingBy(OemStandardProcessEntity::getProcessId));
for (Map.Entry<Long, List<StatementVO>> entry : groupByPsId.entrySet()) {
Long psId = entry.getKey();
List<OemStandardProcessEntity> standardProcessList = standardMap.getOrDefault(psId, Collections.emptyList());
for (StatementVO statementVO : entry.getValue()) {
OemStandardProcessEntity oemStandardProcessEntity = getStandardProcessCode(standardProcessList, statementVO);
if (oemStandardProcessEntity != null) {
statementVO.setStandardProcessCode(oemStandardProcessEntity.getStandardProcessCode());
}
}
if (CollectionUtils.isNotEmpty(saves)) {
Date maxPutStoreTimeDate = getMaxPutStoreTimeDate(settlementVOs);
this.saveBatch(saves);
oemStatementTaskLogService.saveMaxPutStoreTime(maxPutStoreTimeDate);
}
}
}
/**
* 匹配标准工序代码
* 获取标准工序代码
*
* @param allStandardList
* @param statementVO
* @return
*/
private OemStandardProcessEntity matchStandardProcess(List<OemStandardProcessEntity> allStandardList, StatementVO statementVO) {
private OemStandardProcessEntity getStandardProcessCode(List<OemStandardProcessEntity> allStandardList, StatementVO statementVO) {
if (CollectionUtils.isEmpty(allStandardList)) {
return null;
}
@ -1342,12 +1434,44 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
}
/**
* 自动结算
* 结算处理
*
* @param settlementVOs
* @param saves
*/
private void settlementProcess(List<StatementVO> settlementVOs, List<OemStatementEntity> saves) {
Map<String, List<StatementVO>> groupByManual = settlementVOs.stream().collect(Collectors.groupingBy(StatementVO::getManual));
for (Map.Entry<String, List<StatementVO>> entry : groupByManual.entrySet()) {
String manual = entry.getKey();
// 自动结算
if (MANUAL_AUTO.equals(manual)) {
List<StatementVO> autoStatementVOS = settlement(entry.getValue(), BigDecimal.ZERO, false);
for (StatementVO statementVO : autoStatementVOS) {
OemStatementEntity entity = new OemStatementEntity();
BeanUtils.copyProperties(statementVO, entity);
entity.setUpdateTime(new Date());
entity.setIsDeleted(0);
saves.add(entity);
}
} else {
for (StatementVO statementVO : entry.getValue()) {
OemStatementEntity entity = new OemStatementEntity();
BeanUtils.copyProperties(statementVO, entity);
entity.setUpdateTime(new Date());
entity.setIsDeleted(0);
saves.add(entity);
}
}
}
}
/**
* 结算
*
* @param statementVOS
* @return
*/
private List<StatementVO> autoSettlement(List<StatementVO> statementVOS) {
private List<StatementVO> settlement(List<StatementVO> statementVOS, BigDecimal price, boolean preFlag) {
// 1.以外协厂商分组的Map<厂家名称, 待结算工序结算单列表>
Map<String, List<StatementVO>> oemAndStatementMap = statementVOS.stream().collect(Collectors.groupingBy(StatementVO::getOcName));
for (Map.Entry<String, List<StatementVO>> listEntry : oemAndStatementMap.entrySet()) {
@ -1355,7 +1479,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
List<StatementVO> statementVOList = listEntry.getValue();
//2.以外协名称查出的全部报价单
String oemName = listEntry.getKey();
List<PriceSheetVO> priceSheetAllList = getPriceSheets(oemName);
List<PriceSheetVO> priceSheetAllList = getPriceSheetsWithCondition(oemName);
if (priceSheetAllList.isEmpty()) {
//【结算异常】
statementVOList.forEach(statementVO -> {
@ -1372,30 +1496,33 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
//3.为每个结算单匹配报价集合
for (StatementVO statementVO : statementVOList) {
try {
List<PriceSheetVO> matchedPriceSheets = matchTheQuotationsWithCondition(statementVO, priceSheetMap);
List<PriceSheetVO> matchedPriceSheets = matchTheQuotationsWithCondition(statementVO, priceSheetMap, preFlag);
if (null == matchedPriceSheets || matchedPriceSheets.isEmpty()) {
continue;
}
statementVO.setPriceSheetList(matchedPriceSheets);
// 4.匹配规则,过滤出唯一报价
// (1) 供应商代码 + 工序 + 零件号 + 生产标识 + 计划单号 + 现执行价格
if (rule1(statementVO, BigDecimal.ZERO)) {
continue;
}
// (2) 供应商代码 + 工序 + 零件号 + 生产标识 + 现执行价格
if (rule2(statementVO, BigDecimal.ZERO)) {
continue;
}
// (3) 供应商代码 + 生产标识 + 计划单号 + 标准工序代码
if (rule3(statementVO)) {
continue;
}
// (4) 供应商代码 + 生产标识 + 标准工序代码
if (rule4(statementVO)) {
continue;
// 涂色标跳过
if (!hasColorCount(statementVO)) {
// (1) 供应商代码 + 工序 + 零件号 + 生产标识 + 计划单号 + 现执行价格
if (rule1(statementVO, price)) {
continue;
}
// (2) 供应商代码 + 工序 + 零件号 + 生产标识 + 现执行价格
if (rule2(statementVO, price)) {
continue;
}
// (3) 供应商代码 + 生产标识 + 计划单号 + 标准工序代码
if (rule3(statementVO)) {
continue;
}
// (4) 供应商代码 + 生产标识 + 标准工序代码
if (rule4(statementVO)) {
continue;
}
}
// (5) 供应商代码 + 标准工序代码 + 现执行价格
if (rule5(statementVO, BigDecimal.ZERO)) {
if (rule5(statementVO, price)) {
continue;
}
statementVO.setRosStatus(StatementVO.ERR_SETTLEMENT);
@ -1411,6 +1538,28 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
return statementVOS;
}
/**
* 获取报价单列表
*
* @param oemName
* @return
*/
private List<PriceSheetVO> getPriceSheetsWithCondition(String oemName) {
PriceSheetQuery query = new PriceSheetQuery();
query.setOcName(oemName);
query.setValidflags(Arrays.asList("有效", "无效"));
query.setPapertype("外协定价");
query.setPricetype("工序协作");
R<Page<PriceSheetVO>> pageR = erpDataOemClient.priceSheetData(query, new Query() {{
setSize(99999);
}});
if (pageR != null && pageR.getData() != null) {
return pageR.getData().getRecords();
}
return Collections.emptyList();
}
/**
* 匹配报价单
*
@ -1418,7 +1567,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
* @param priceSheetMap
* @return
*/
private List<PriceSheetVO> matchTheQuotationsWithCondition(StatementVO statementVO, Map<String, List<PriceSheetVO>> priceSheetMap) {
private List<PriceSheetVO> matchTheQuotationsWithCondition(StatementVO statementVO, Map<String, List<PriceSheetVO>> priceSheetMap, boolean preFlag) {
String psName = statementVO.getPsName();
if (!priceSheetMap.containsKey(psName)) {
//【结算异常】
@ -1429,7 +1578,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
List<PriceSheetVO> result = new ArrayList<>();
//获得外协厂商该工序下报价单列表
for (PriceSheetVO priceSheetVO : priceSheetMap.get(psName)) {
if (isValid(statementVO, priceSheetVO)) {
if (isValid(statementVO, priceSheetVO, preFlag)) {
result.add(priceSheetVO);
}
}
@ -1446,15 +1595,10 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
*
* @param statementVO
* @param priceSheetVO
* @param preFlag 是否预结算
* @return
*/
private boolean isValid(StatementVO statementVO, PriceSheetVO priceSheetVO) {
if (!"工序协作".equals(priceSheetVO.getPricetype())) {
return false;
}
if (!"有效".equals(priceSheetVO.getValidflag()) && !"无效".equals(priceSheetVO.getValidflag())) {
return false;
}
private boolean isValid(StatementVO statementVO, PriceSheetVO priceSheetVO, boolean preFlag) {
String startTime = priceSheetVO.getStartdat();
String validTime = priceSheetVO.getValiddat();
String putStoreTime = statementVO.getPutStoreTime();
@ -1466,7 +1610,11 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
LocalDate startDate = LocalDate.parse(startTime, fmt);
LocalDate validDate = LocalDate.parse(validTime, fmt);
LocalDate putStoreDate = LocalDate.parse(putStoreTime, fmt);
return !putStoreDate.isBefore(startDate) && !putStoreDate.isAfter(validDate);
if (preFlag) {
return !putStoreDate.isBefore(startDate);
} else {
return !putStoreDate.isBefore(startDate) && !putStoreDate.isAfter(validDate);
}
} catch (Exception e) {
return false;
}
@ -1480,10 +1628,6 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
* @return
*/
private boolean rule1(StatementVO statementVO, BigDecimal price) {
// 涂色标跳过
if (hasColorCount(statementVO)) {
return false;
}
List<PriceSheetVO> priceSheetList = statementVO.getPriceSheetList();
if (CollectionUtils.isEmpty(priceSheetList)) {
return false;
@ -1515,10 +1659,6 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
* @return
*/
private boolean rule2(StatementVO statementVO, BigDecimal price) {
// 涂色标跳过
if (hasColorCount(statementVO)) {
return false;
}
List<PriceSheetVO> priceSheetList = statementVO.getPriceSheetList();
if (CollectionUtils.isEmpty(priceSheetList)) {
return false;
@ -1548,24 +1688,22 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
* @return
*/
private boolean rule3(StatementVO statementVO) {
// 涂色标跳过
if (hasColorCount(statementVO)) {
return false;
}
List<PriceSheetVO> priceSheetList = statementVO.getPriceSheetList();
if (CollectionUtils.isEmpty(priceSheetList)) {
return false;
}
// 结算单字段
String standardProcessCode = statementVO.getStandardProcessCode();
if (StringUtils.isEmpty(standardProcessCode)) {
return false;
}
String ocCode = statementVO.getOcCode();
String prodIdent = statementVO.getProdIdent();
String woCode = statementVO.getWoCode();
String standardProcessCode = statementVO.getStandardProcessCode();
for (PriceSheetVO sheet : priceSheetList) {
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode) && StringUtils.equals(sheet.getPrtlotno(), prodIdent) && StringUtils.equals(sheet.getWono(), woCode)
// TODO 报价单标准工艺代码没加
// && StringUtils.equals(sheet.getWono(), standardProcessCode)
;
&& StringUtils.equals(sheet.getWono(), standardProcessCode);
if (match && ruleTieredPricing(statementVO, sheet)) {
return setSettlementInfo(statementVO, sheet);
}
@ -1580,23 +1718,21 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
* @return
*/
private boolean rule4(StatementVO statementVO) {
// 涂色标跳过
if (hasColorCount(statementVO)) {
return false;
}
List<PriceSheetVO> priceSheetList = statementVO.getPriceSheetList();
if (CollectionUtils.isEmpty(priceSheetList)) {
return false;
}
// 结算单字段
String standardProcessCode = statementVO.getStandardProcessCode();
if (StringUtils.isEmpty(standardProcessCode)) {
return false;
}
String ocCode = statementVO.getOcCode();
String prodIdent = statementVO.getProdIdent();
String standardProcessCode = statementVO.getStandardProcessCode();
for (PriceSheetVO sheet : priceSheetList) {
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode) && StringUtils.equals(sheet.getPrtlotno(), prodIdent)
// TODO 报价单标准工艺代码没加
// && StringUtils.equals(sheet.getWono(), standardProcessCode)
;
&& StringUtils.equals(sheet.getWono(), standardProcessCode);
if (match && ruleTieredPricing(statementVO, sheet)) {
return setSettlementInfo(statementVO, sheet);
}
@ -1616,15 +1752,17 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
if (CollectionUtils.isEmpty(priceSheetList)) {
return false;
}
List<PriceSheetVO> colorPriceSheetVOS = new ArrayList<>();
// 结算单字段
String ocCode = statementVO.getOcCode();
String standardProcessCode = statementVO.getStandardProcessCode();
if (StringUtils.isEmpty(standardProcessCode)) {
return false;
}
String ocCode = statementVO.getOcCode();
List<PriceSheetVO> colorPriceSheetVOS = new ArrayList<>();
for (PriceSheetVO sheet : priceSheetList) {
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode)
// TODO 报价单标准工艺代码没加
// && StringUtils.equals(sheet.getWono(), standardProcessCode)
;
&& StringUtils.equals(sheet.getWono(), standardProcessCode);
if (match && price != null && price.compareTo(BigDecimal.ZERO) != 0) {
// TODO 金银价格字段缺失
match = PriceMatcher.isContainsPrice(sheet.getRemark(), price);
@ -1658,12 +1796,14 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
BigDecimal qty = new BigDecimal(statementVO.getMakeQty() == null ? "0" : statementVO.getMakeQty().trim());
BigDecimal totalArea = new BigDecimal(statementVO.getTotalArea() == null ? "0" : statementVO.getTotalArea().trim());
BigDecimal totalPrice;
if ("平方分米".equals(sheet.getPrtum())) {
// 平方分米
if ("3".equals(sheet.getStairunit())) {
totalPrice = unitPrice.multiply(totalArea);
} else {
totalPrice = unitPrice.multiply(qty);
}
statementVO.setRosStatus(StatementVO.IN_SETTLEMENT);
statementVO.setSettleTime(new Date());
statementVO.setApprovalStatus(StatementVO.APPROVAL_STATUS_UNDER);
statementVO.setUnitPrice(unitPrice);
statementVO.setUnit(sheet.getPrtum());
@ -1737,6 +1877,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
//如总价大于0,则报价成功
if (totalPrice.compareTo(BigDecimal.ZERO) > 0) {
statementVO.setRosStatus(StatementVO.IN_SETTLEMENT);
statementVO.setSettleTime(new Date());
statementVO.setApprovalStatus(StatementVO.APPROVAL_STATUS_UNDER);
statementVO.setTotalPrice(totalPrice);
statementVO.setMemo("结算中");
@ -1759,17 +1900,22 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
*/
private boolean ruleTieredPricing(StatementVO statementVO, PriceSheetVO priceSheet) {
//匹配阶梯价
if (priceSheet.getStairflag().equals("单批阶梯价(按件数)")) {
// 单批阶梯价(按件数)
if (priceSheet.getStairflag().equals("4")) {
double makeQty = Double.parseDouble(statementVO.getMakeQty());
double lower = Double.parseDouble(priceSheet.getLower());
double upper = Double.parseDouble(priceSheet.getUpper());
return makeQty >= upper && makeQty <= lower;
} else if (priceSheet.getStairflag().equals("单批阶梯价(按单件面积)")) {
}
// 单批阶梯价(按单件面积)
else if (priceSheet.getStairflag().equals("5")) {
double ypArea = Double.parseDouble(statementVO.getYpArea());
double lower = Double.parseDouble(priceSheet.getLower());
double upper = Double.parseDouble(priceSheet.getUpper());
return ypArea >= upper && ypArea <= lower;
} else if (priceSheet.getStairflag().equals("单批阶梯价(按单批面积)")) {
}
// 单批阶梯价(按单批面积)
else if (priceSheet.getStairflag().equals("6")) {
double totalArea = Double.parseDouble(statementVO.getTotalArea());
double lower = Double.parseDouble(priceSheet.getLower());
double upper = Double.parseDouble(priceSheet.getUpper());
@ -1806,4 +1952,95 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
.orElse(null);
}
@Override
public R manualSettlement(StatementQuery mesOemStatement) {
IPage<StatementVO> page = new Page<>();
page.setSize(999);
List<StatementVO> statementVOS = baseMapper.selectOemStatementPage(page, mesOemStatement);
List<OemStatementEntity> saves = new ArrayList<>();
BigDecimal price = BigDecimal.ZERO;
if (mesOemStatement.getPrice() != null) {
price = mesOemStatement.getPrice();
}
List<StatementVO> settlementList = settlement(statementVOS, price, false);
for (StatementVO statementVO : settlementList) {
OemStatementEntity entity = new OemStatementEntity();
BeanUtils.copyProperties(statementVO, entity);
entity.setUpdateTime(new Date());
entity.setIsDeleted(0);
saves.add(entity);
}
if (CollectionUtils.isEmpty(saves)) {
return R.fail("没有需要结算的数据");
}
return R.status(this.saveOrUpdateBatch(saves));
}
@Override
public List<StatementVO> manualPreSettlement(StatementQuery mesOemStatement) {
IPage<StatementVO> page = new Page<>();
page.setSize(999);
List<StatementVO> statementVOS = baseMapper.selectOemStatementPage(page, mesOemStatement);
statementVOS = statementVOS.stream().filter(vo -> {
String memo = vo.getMemo();
return !"无需结算".equals(memo)
&& !"重复镀后入库".equals(memo);
})
.collect(Collectors.toList());
BigDecimal price = BigDecimal.ZERO;
if (mesOemStatement.getPrice() != null) {
price = mesOemStatement.getPrice();
}
List<StatementVO> settlementList = settlement(statementVOS, price, true);
return settlementList;
}
@Override
public R matchStandardProcessCode() {
// 1. 查询所有【结算异常】状态的数据(带关联字段)
List<StatementVO> errorStatements = baseMapper.selectErrorStatements();
if (CollectionUtils.isEmpty(errorStatements)) {
return R.success("没有需要匹配的结算异常数据");
}
// 2. 过滤掉异常原因为"无需结算、重复镀后入库"的数据
List<StatementVO> needMatchList = errorStatements.stream()
.filter(vo -> {
String memo = vo.getMemo();
// 排除"无需结算"和"重复镀后入库"
return !StrUtil.contains(memo, "无需结算")
&& !StrUtil.contains(memo, "重复镀后入库");
})
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(needMatchList)) {
return R.success("没有需要匹配标准工序代码的数据");
}
// 3. 执行匹配逻辑
matchStandardProcess(needMatchList);
// 4. 更新数据库
List<OemStatementEntity> updateList = needMatchList.stream()
//.filter(vo -> StringUtils.isNotEmpty(vo.getStandardProcessCode()))
.map(vo -> {
OemStatementEntity entity = new OemStatementEntity();
entity.setId(vo.getId());
entity.setStandardProcessCode(vo.getStandardProcessCode());
entity.setUpdateTime(new Date());
return entity;
})
.collect(Collectors.toList());
if (!CollectionUtils.isEmpty(updateList)) {
this.updateBatchById(updateList);
}
return R.success();
}
}

@ -352,4 +352,12 @@ public class YieldOrderController extends BladeController {
String code = yieldOrderService.generateMdCode();
return R.data(code);
}
/**
* 根据零件号获取工装
*/
@GetMapping("/createBlbYieldOrder")
public R createBlbYieldOrder(@RequestParam String partCode,@RequestParam Double qty,@RequestParam String memo) {
return R.data(yieldOrderService.createBlbYieldOrder(partCode,qty,memo));
}
}

@ -80,4 +80,9 @@ public class OrderClient implements IOrderClient {
orderService.dataVerify(idList);
}
}
@Override
public Boolean createBlbYieldOrder(String partCode, Double qty, String memo) {
return orderService.createBlbYieldOrder(partCode,qty,memo);
}
}

@ -293,4 +293,6 @@ public interface IYieldOrderService extends BaseService<YieldOrder> {
List<YieldOrderCraft> confirm(String cardNo,String mark);
String generateMdCode();
boolean createBlbYieldOrder(String partCode,Double qty,String memo);
}

@ -1357,7 +1357,7 @@ public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, Yie
subYield.setPlate(dsPart.getPlate());
subYield.setUseDept("热表分厂");
subYield.setYpArea(dsPart.getArea() == null ? 0d : dsPart.getArea());
subYield.setDemandDate(DateUtil.minusDays(DateUtil.now(), 2));
subYield.setDemandDate(DateUtil.plusDays(DateUtil.now(), 2));
subYield.setReleaseDate(DateUtil.now());
subYield.setCardNo(nextCardNo());
subYield.setBatchNo(nextBatchNo());
@ -1581,4 +1581,62 @@ public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, Yie
return codePattern + StringPrefixUtils.prefix(String.valueOf(num), "0", len);
}
public boolean createBlbYieldOrder(String partCode,Double qty,String memo){
DsPartEntity dsPart = dsPartService.selectDsPartByPatCodeAndVersion(partCode,null);
String roamNo = yieldOrderClient.getChildRoamNoByPartCode(partCode);
YieldOrder order = new YieldOrder();
order.setId(null);
order.setYoCode(nextBlbCode2(0));
order.setPartCode(partCode);
order.setProductType(dsPart.getProductType());
order.setPartName(dsPart.getPartName());
order.setPlate(dsPart.getPlate());
order.setUseDept("热表分厂");
order.setYpArea(dsPart.getArea() == null ? 0d : dsPart.getArea());
order.setDemandDate(DateUtil.plusDays(DateUtil.now(), 7));
order.setReleaseDate(DateUtil.now());
order.setCardNo(nextBlbCode2(1));
order.setBatchNo(nextBlbCode2(2));
order.setSiteWork(Boolean.TRUE);
order.setYpQty(qty);
order.setPrimaryCraft(dsPart.getCraftWay());
order.setRoamNo(roamNo);
order.setStatus(YieldOrderEnum.STATUS_NORMAL.getCode());
order.setYieldType(YieldOrderEnum.YIELD_TYPE_3.getCode());
order.setPriorityAps(5);
order.setEntrustDept("热表分厂");
order.setBusinessType(-1);
order.setPlanDeptCode("3400");
order.setReceiveTime(DateUtil.now());
order.setProduceBool(Boolean.FALSE);
order.setMemo(memo);
order.setProductIdent("JI");
return this.save(order);
}
/**
* @param codeType 0:订单号1流程卡号2批次号
* @return String
* @Description: 用于给玻璃饼产生对应的订单号 流程卡号批次号
* @Author dxl
* @CreateTime 2023/10/12 16:03
*/
private String nextBlbCode2(int codeType) {
// 自增总长度
int len = 5;
// 编码模式
String codePattern = "RB" + DateUtil.today().substring(2);
int num = this.getMaxCodeByPattern(codePattern, len);
// 下个编码
if (codeType == 0) {
codePattern = "WO-B" + DateUtil.today().substring(2);
}else if(codeType == 2){
codePattern = "Y" + DateUtil.today().substring(2);
}
return codePattern + StringPrefixUtils.prefix(String.valueOf(num), "0", len);
}
}

@ -1393,7 +1393,8 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
// 工序信息
WorkPlan workPlan = workPlanService.getById(wpId);
BeanUtils.copyProperties(workPlan, planDataVO);
User receiveMan = UserCache.getUser(workPlan.getReceiveMan());
planDataVO.setReceiveName(receiveMan != null ? receiveMan.getRealName() : "");
// 加工记录
List<MakeRec> makeRecs = makeRecService.list(Wrappers.lambdaQuery(MakeRec.class).eq(MakeRec::getWpId, wpId));
if (CollectionUtils.isNotEmpty(makeRecs)) {
@ -1688,6 +1689,9 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
inspectionTask.setWpId(workPlan.getId());
inspectionTask.setCheckUserId(userId);
inspectionTask.setCheckDate(LocalDateTime.now());
inspectionTask.setScrapQty(0d);
inspectionTask.setCheckQty(0d);
inspectionTask.setLossQty(0d);
inspectionTaskMapper.insertOrUpdate(inspectionTask);
// 保存检验项目

@ -76,10 +76,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -729,12 +726,28 @@ public class InspectionTaskController extends BladeController {
qw.eq("TASK_ID", id);
List<ReviewSheet> listSheet = rsSubService.list(qw);
// InspectionTask inspectionTask = new InspectionTask();
// inspectionTask.setId(id);
// InspectionTask detail = service.getOne(Condition.getQueryWrapper(inspectionTask));
InspectionTask detail = service.getById( id);
WorkPlan workPlan = workPlanService.getOne(new QueryWrapper<WorkPlan>().lambda().eq(WorkPlan::getId, detail.getWpId()));
// 根据workPlan的frontWpId(上一到工序ID)一直往上循环查询到cruxProcess为1的关键工序
if (workPlan != null && workPlan.getFrontWpId() != null) {
Long currentFrontWpId = workPlan.getFrontWpId();
//(A→B→A)
int maxIterations = 100;
int iterations = 0;
while (Objects.nonNull(currentFrontWpId) && iterations < maxIterations) {
WorkPlan frontWorkPlan = workPlanService.getById(currentFrontWpId);
if (BeanUtil.isEmpty(frontWorkPlan)) {
break;
}
// 关键工序
if (StrUtil.isNotEmpty(frontWorkPlan.getCruxProcess()) && "1".equals(frontWorkPlan.getCruxProcess().trim())) {
workPlan = frontWorkPlan;
break;
}
currentFrontWpId = frontWorkPlan.getFrontWpId();
iterations++;
}
}
List<ProduceMonitorSlotListVO> list = new ArrayList<>();
if(null != workPlan){
list = macToolUseService.listSlotInfo(workPlan);
@ -749,7 +762,6 @@ public class InspectionTaskController extends BladeController {
}
}
return R.data(list);
// return service.getSamePlace(id);
}

@ -78,7 +78,8 @@ STATUS_VALUE
TS_NAME
-->
<select id="selectLiquidTankTaskPageByJoin" resultType="org.springblade.desk.quality.pojo.vo.LiquidTankTaskVO">
SELECT task.CODE,
SELECT task.ID,
task.CODE,
task.LIQUID_TANK_TASK_TYPE,
task.WORK_CENTER_ID,
task.WORK_TANK_ID,

@ -1508,9 +1508,9 @@ public class InspectionTaskServiceImpl extends BaseServiceImpl<InspectionTaskMap
StatusCountMap map = new StatusCountMap();
int sumCheckQ = 0, sumTestQty = 0, sumLossQty = 0;
for (WorkPlanItem item : itemList) {
sumCheckQ += item.getCheckQty();
sumTestQty += item.getTestQty();
sumLossQty += item.getLossQty();
sumCheckQ += item.getCheckQty() != null ? item.getCheckQty().intValue() : 0;
sumTestQty += item.getTestQty() != null ? item.getTestQty().intValue() : 0;
sumLossQty += item.getLossQty() != null ? item.getLossQty().intValue() : 0;
map.add1(item.getCheckResult());
}
int countToDo = map.get(InspectionTaskConst.CHECK_RESULT_TODO);

@ -3,6 +3,8 @@
*/
package org.springblade.desk.quality.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -15,6 +17,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.desk.dashboard.pojo.entity.DsProcessMeasuringToolEntity;
import org.springblade.desk.dashboard.service.IDsProcessMeasuringToolService;
import org.springblade.desk.device.pojo.entity.MeasurementRecordsEntity;
import org.springblade.desk.device.service.IMeasurementRecordsService;
import org.springblade.desk.quality.excel.WorkPlanItemDetailExcel;
import org.springblade.desk.quality.mapper.WorkPlanItemDetailMapper;
import org.springblade.desk.quality.pojo.entity.WorkPlanItem;
@ -29,6 +33,7 @@ import org.springblade.system.feign.IUserClient;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
/**
* [工序检验项明细] 服务实现类
@ -51,6 +56,7 @@ public class WorkPlanItemDetailServiceImpl extends BaseServiceImpl<WorkPlanItemD
private final IDsProcessMeasuringToolService processMeasuringToolService;
private final IMeasurementRecordsService mesMeasurementRecordsService;
@Override
public IPage<WorkPlanItemDetailVO> selectWorkPlanItemDetailPage(IPage<WorkPlanItemDetailVO> page, WorkPlanItemDetailVO workPlanItemDetail) {
return page.setRecords(baseMapper.selectWorkPlanItemDetailPage(page, workPlanItemDetail));
@ -67,7 +73,19 @@ public class WorkPlanItemDetailServiceImpl extends BaseServiceImpl<WorkPlanItemD
@Override
public void setVOValue(WorkPlanItemDetailVO vo) {
if (BeanUtil.isEmpty(vo)) {
return;
}
if (Objects.isNull(vo.getActMtId())) {
return;
}
MeasurementRecordsEntity processMeasuringToolEntity = mesMeasurementRecordsService.getById(vo.getActMtId());
if (BeanUtil.isEmpty(processMeasuringToolEntity)) {
return;
}
vo.setActMtName(processMeasuringToolEntity.getMcName());
vo.setRuleSize(processMeasuringToolEntity.getNorms());
vo.setDueDate(processMeasuringToolEntity.getDueDate());
}
@Override

@ -36,6 +36,19 @@
<if test="query.inDateEnd != null and query.inDateEnd != ''">
AND to_date(#{query.inDateEnd},'YYYY-MM-DD HH24:MI:SS'), <![CDATA[ <= ]]> a.validdat
</if>
<if test="query.validflags != null and query.validflags != ''">
AND a.validflag IN
<foreach collection="query.validflags.split(',')" item="validflag"
open="(" separator="," close=")" index="index">
#{validflag}
</foreach>
</if>
<if test="query.papertype != null and query.papertype != ''">
AND a.papertype = #{query.papertype}
</if>
<if test="query.pricetype != null and query.pricetype != ''">
AND a.pricetype = #{query.pricetype}
</if>
</where>
-- ORDER BY a.reqdate DESC
</select>

@ -895,7 +895,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
workOrder.setRunStatus(2);
workOrder.setPickingStatus(0);
workOrder.setOem("0");
workOrder.setPriority(order.getPriorityAps());
workOrder.setPriority(order.getPriorityErp());
workOrder.setApprovalStatus(1);
workOrder.setScrapQty(0);
workOrder.setOemOut("0");
@ -906,6 +906,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
workOrder.setReInStore("0");
workOrder.setPartCode(order.getPartCode());
workOrder.setDemandDate(order.getDemandDate());
workOrder.setSendDownTime(new Date());
//调度员是主工序加工班组的调度员
if (workPlanList.get(0).getMakeTeam() != null) {
TeamSetEntity teamSet = teamSetService.getById(workPlanList.get(0).getMakeTeam());

@ -28,6 +28,7 @@ package org.springblade.system.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@ -529,6 +530,10 @@ public class UserController {
@Operation(summary = "根据角色别名查询所有用户", description = "传入roleAlias")
public R<List<UserVO>> listAllByRole(@Parameter(description = "角色别名") String roleAlias) {
List<User> list = userExtService.listAllByRole(roleAlias);
if(ObjectUtils.isEmpty(list)){
List<UserVO> list1 = new ArrayList<>();
return R.data(list1);
}
return R.data(UserWrapper.build().listVO(list));
}

Loading…
Cancel
Save