Merge branch 'main' of ssh://192.168.1.205:9922/cf_devdept2/cf_imes_server

This commit is contained in:
lym
2024-08-29 17:36:48 +08:00
169 changed files with 4743 additions and 1809 deletions
@@ -0,0 +1,81 @@
package com.cf.imes.module.executor.api.goods.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class GoodsDTO {
/**
* 主键
*/
private Long id;
// 组织 ID
private Long organId;
/**
* 生产单号
*/
private Long orderId;
/**
* 设计端商品ID
*/
private String rawGoodsId;
/**
* 商品 ID
*/
private String goodsId;
/**
* 商品名称
*/
private String goodsName;
/**
* 材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板
*/
private String material;
/**
* 纹路 0 正纹 1 可翻转 2 反纹
*/
private Boolean texture;
/**
* 颜色
*/
private String color;
/**
* 宽度
*/
private BigDecimal width;
/**
* 高度
*/
private BigDecimal height;
/**
* 厚度
*/
private BigDecimal thickness;
/**
* 价格
*/
private BigDecimal price;
/**
* 品牌
*/
private String brand;
/**
* 规格
*/
private String spec;
/**
* 备注
*/
private String remark;
/**
* 是否删除
*/
private Boolean deleted;
}
@@ -0,0 +1,62 @@
package com.cf.imes.module.executor.api.plan.dto;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class PlanDTO {
/**
* ID
*/
private Long id;
// 组织 ID
private Long organId;
/**
* 排序优先级
*/
private Long sort;
/**
* 排单类型:1 混单排单,2 生产单排单
*/
private Integer type;
/**
* 排单状态:0 新单,1 板材已申请,2 开料中,3 已开料
*/
private Integer status;
/**
* 机台 ID
*/
private Long machineId;
/**
* 计划时间
*/
private LocalDateTime planTime;
/**
* 生产单号
*/
private String orderNos;
/**
* 备注
*/
private String remark;
/**
* 生产操作人
*/
private String operator;
/**
* 生产时间
*/
private LocalDateTime produceTime;
}
@@ -11,12 +11,14 @@ public interface ErrorCodeConstants {
// ========== 生产单开料排单
ErrorCode PLAN_NOT_EXISTS = new ErrorCode(1_001_107_000, "生产单开料排单不存在");
ErrorCode PLAN_NOT_ALLOW_DELETE = new ErrorCode(1_001_107_001, "当前排单已开料不予许删除");
ErrorCode PLAN_NOT_ALLOW_DELETE = new ErrorCode(1_001_107_001, "排单号:{}已开料不予许删除");
ErrorCode PLAN_NOT_ALLOW_CANCEL = new ErrorCode(1_001_107_002, "排单 新单 不予许作废");
ErrorCode LIST_CHANGES_ARE_PROHIBITED = new ErrorCode(1_001_107_003, "当前排单有板材已开料,禁止更改");
ErrorCode PLAN_ERROR = new ErrorCode(1_001_107_004, "{} 排单数据不存在");
// ========== 生产单商品 TODO 补充编号 ==========
ErrorCode GOODS_NOT_EXISTS = new ErrorCode(1_001_108_000, "生产单商品不存在");
@@ -0,0 +1,58 @@
package com.cf.imes.module.executor.api.plan.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderGroupRespVO {
@Schema(description = "加工组ID")
private Long id;
@Schema(description = "生产单号")
private Long orderId;
@Schema(description = "柜体ID")
private Long bodyId;
@Schema(description = "加工组类型")
private String groupTypeName;
@Schema(description = "模块名称")
private String name;
@Schema(description = "加工组宽度")
private Double width;
@Schema(description = "加工组高度")
private Double height;
@Schema(description = "加工组深度")
private Double depth;
@Schema(description = "加工组总数")
private Integer groupNum;
}
@@ -90,7 +90,7 @@ public class OrderStatisticsController {
@GetMapping("/bigPlateCount/group")
@Operation(summary = "大板数量分组统计")
public CommonResult<Map<String, Object>> getBigPlateCount(@Valid OrderStatisticsReqVO reqVO) {
return success(null);
return success(orderStatisticsService.getBigPlateCountGroup(reqVO));
}
}
@@ -1,15 +1,17 @@
package com.cf.imes.module.executor.controller.admin.plan;
import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.framework.operatelog.core.annotations.OperateLog;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderSource;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.CuttingStatusRespVO;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.SavePlanPlateResultReqVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.*;
import com.cf.imes.module.executor.controller.admin.plate.vo.PlateSaveReqVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.AddRemainReqVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.GetSourceDataReq;
import com.cf.imes.module.executor.controller.admin.plan.vo.PlateOptimize;
import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO;
import com.cf.imes.module.executor.service.optimizeplan.OptimizePlanService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -53,10 +55,15 @@ public class OptimizePlanController {
@GetMapping("commit")
@Operation(summary = "始开")
@Operation(summary = "开料")
@Parameters({
@Parameter(name = "planId", description = "排单ID", required = true, example = "1024"),
@Parameter(name = "goodsNo", description = "开料的大板编号", required = true, example = "1")
})
@PreAuthorize("@ss.hasPermission('placeorder:optimize')")
public CommonResult<Boolean> commit(@RequestParam @Valid @NotNull(message = "排单id不能空") Long planId) {
return CommonResult.success(optimizePlanService.commit(planId));
public CommonResult<Boolean> commit(@RequestParam("planId") Long planId,@RequestParam("goodsNo") List<Long> goodsNo) {
return CommonResult.success(optimizePlanService.commit(planId,goodsNo));
}
@GetMapping("/endCutting")
@@ -67,14 +74,24 @@ public class OptimizePlanController {
}
@PutMapping("/updateCuttingStatus")
@Operation(summary = "修改开料状态")
@PreAuthorize("@ss.hasPermission('placeorder:optimize:updateCuttingStatus')")
public CommonResult<Boolean> updateCuttingStatus(@RequestBody CuttingStatusRespVO respVO) {
return success(optimizePlanService.updateCuttingStatus(respVO));
}
@GetMapping("/getOrderSource")
@Operation(summary = "获取生产单源数据")
@PreAuthorize("@ss.hasPermission('placeorder:optimize')")
public CommonResult<OrderSource> getOrderSource(@Schema(description = "生产单id") @RequestParam(required = false) Long orderId,
@Schema(description = "大板IDS-大板分类的IDS") @RequestParam(required = false) List<Long> ids,
@Schema(description = "排单id") @RequestParam(required = false) Long planId,
@Schema(description = "机台Id") @RequestParam("machineId") Long machineId
) {
return CommonResult.success(optimizePlanService.getOrderSource(orderId, planId, machineId));
return CommonResult.success(optimizePlanService.getOrderSource(orderId, planId, machineId,ids));
}
@@ -111,5 +128,13 @@ public class OptimizePlanController {
}
@DeleteMapping("/delete")
@Operation(summary = "ES批量删除测试")
@PreAuthorize("@ss.hasPermission('placeorder:delete')")
public CommonResult<String> deleteTest(@RequestParam("id") List<Long> id) {
return success(optimizePlanService.deleteTest(id));
}
}
@@ -1,30 +1,36 @@
package com.cf.imes.module.executor.controller.admin.plan;
import com.cf.imes.framework.es.core.valid.CreateGroup;
import com.cf.imes.framework.es.core.valid.UpdateGroup;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderRespVO;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.*;
import javax.servlet.http.*;
import javax.validation.constraints.NotEmpty;
import java.util.*;
import java.io.IOException;
import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.framework.common.pojo.PageParam;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import static com.cf.imes.framework.common.pojo.CommonResult.success;
import com.cf.imes.framework.es.core.valid.CreateGroup;
import com.cf.imes.framework.es.core.valid.UpdateGroup;
import com.cf.imes.framework.excel.core.util.ExcelUtils;
import com.cf.imes.framework.operatelog.core.annotations.OperateLog;
import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.*;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderRespVO;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomBodyList;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.NotPlanGoodsReqVO;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.NotPlanGoodsRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.*;
import com.cf.imes.module.executor.service.plan.PlanService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import static com.cf.imes.framework.common.pojo.CommonResult.success;
import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@Tag(name = "管理后台 - 排单")
@RestController
@@ -38,7 +44,7 @@ public class PlanController {
@PostMapping("/create")
@Operation(summary = "创建排单")
@PreAuthorize("@ss.hasPermission('placeorder:create')")
public CommonResult<Long> createPlan(@Validated(CreateGroup.class) @RequestBody PlanSaveReqVO createReqVO) {
public CommonResult<Map<Long,Long>> createPlan(@Validated(CreateGroup.class) @RequestBody PlanSaveReqVO createReqVO) {
return success(planService.createPlan(createReqVO));
}
@@ -52,16 +58,16 @@ public class PlanController {
@DeleteMapping("/delete")
@Operation(summary = "删除排单")
@Parameter(name = "id", description = "排单id", required = true)
@Parameter(name = "ids", description = "排单ids", required = true)
@PreAuthorize("@ss.hasPermission('placeorder:delete')")
public CommonResult<Boolean> deletePlan(@RequestParam("id") Long id) {
return success(planService.deletePlan(id));
public CommonResult<Boolean> deletePlan(@RequestParam("ids") List<Long> ids) {
return success(planService.deletePlan(ids));
}
@DeleteMapping("cancellation")
@Operation(summary = "作废")
@Parameter(name = "id", description = "排单id", required = true)
@PreAuthorize("@ss.hasPermission('executor:plan:delete')")
// @DeleteMapping("cancellation")
// @Operation(summary = "作废")
// @Parameter(name = "id", description = "排单id", required = true)
// @PreAuthorize("@ss.hasPermission('executor:plan:delete')")
public CommonResult<Boolean> cancellation(@RequestParam("id") Long id) {
return success(planService.cancellation(id));
}
@@ -106,12 +112,19 @@ public class PlanController {
}
@GetMapping("getNotPlanOrderListPage")
@Operation(summary = "获取未排单的板材生产单板材分页列表")
@Operation(summary = "获取未排单的生产单分页列表")
@PreAuthorize("@ss.hasPermission('placeorder:query')")
public CommonResult<PageResult<OrderRespVOCopy>> getOrderPage(@Valid OrderPageReqVOCopy pageReqVO) {
return success(planService.getOrderPage(pageReqVO));
}
@GetMapping("getNotPlanOrderPlateList")
@Operation(summary = "获取未排单的板材分页列表")
@PreAuthorize("@ss.hasPermission('placeorder:query')")
public CommonResult<List<NotPlanOrderPlateRespVO>> getOrderPlateList(@Valid OrderPageReqVOCopy pageReqVO) {
return success(planService.getOrderPlateList(pageReqVO));
}
@GetMapping("getNotPlanGoodsListPage")
@Operation(summary = "获取未排单的大板板材分页列表")
@@ -122,13 +135,14 @@ public class PlanController {
@GetMapping("getNotPlanPlateListPage")
@Operation(summary = "获取未排单的板材分页列表")
@PostMapping("getNotOptimizeGoodsList")
@Operation(summary = "优化界面未排单的大板板材分页列表")
@PreAuthorize("@ss.hasPermission('executor:plan:query')")
public CommonResult<List<PlatePage>> getNotPlanPlateListPage(@Valid PlateReqPageVO pageVO) {
return success(planService.getNotPlanPlateListPage(pageVO));
public CommonResult<List<NotPlanGoodsRespVO>> getNotOptimizeGoodsList(@Valid @RequestBody NotPlanGoodsReqVO reqVO) {
return success(planService.getNotOptimizeGoodsList(reqVO));
}
@GetMapping("getNotPlanGoodsListPageByOrderId")
@Operation(summary = "根据生产单id获取未排单的商品分页列表")
@PreAuthorize("@ss.hasPermission('executor:plan:query')")
@@ -180,4 +194,15 @@ public class PlanController {
return success(planService.getPlateList(planIds));
}
@GetMapping("getOrderRoomBodyList")
@Operation(summary = "获取未排单的生产单的柜体和房间名称")
@Parameter(name = "orderIds", description = "生产单ID", required = true)
@PreAuthorize("@ss.hasPermission('placeorder:orderlist')")
public CommonResult<List<OrderRoomBodyList>> getOrderRoomBody(@Valid @RequestParam List<Long> orderIds) {
return success(planService.getOrderRoomBody(orderIds));
}
}
@@ -0,0 +1,18 @@
package com.cf.imes.module.executor.controller.admin.plan.bo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class OrderBodyIds {
@Schema(description = "柜体ID")
private Long bodyId;
@Schema(description = "柜体名称")
private String bodyName;
}
@@ -3,16 +3,15 @@ package com.cf.imes.module.executor.controller.admin.plan.bo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.Builder;
@Data
@Builder
public class OrderIds {
@Schema(description = "大板ID")
@Schema(description = "大板ID-大板分类的ID")
private Long id;
@@ -20,7 +19,7 @@ public class OrderIds {
private Long orderId;
@Schema(description = "商品ID")
@Schema(description = "商品ID-板材库对应的大板ID")
private Long goodsId;
@@ -0,0 +1,20 @@
package com.cf.imes.module.executor.controller.admin.plan.bo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class OrderRoomBodyList {
@Schema(description = "生产单ID")
private Long orderId;
@Schema(description = "柜体房间信息")
private List<OrderRoomIds> orderRoomIds;
}
@@ -0,0 +1,23 @@
package com.cf.imes.module.executor.controller.admin.plan.bo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class OrderRoomIds {
@Schema(description = "房间ID")
private Long roomId;
@Schema(description = "房间名称")
private String roomName;
@Schema(description = "柜体信息")
private List<OrderBodyIds> orderBodyIds;
}
@@ -0,0 +1,25 @@
package com.cf.imes.module.executor.controller.admin.plan.saveOptimize;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.ToString;
@Schema(description = "小板优化的数据信息")
@Data
@ToString(callSuper = true)
public class BlockPlaceInfo {
@Schema(description = "大板编号")
private Long bi;
@Schema(description = "小板编号")
private Long bo;
public BlockPlaceInfo(Long bi, Long bo) {
this.bi = bi;
this.bo = bo;
}
}
@@ -0,0 +1,20 @@
package com.cf.imes.module.executor.controller.admin.plan.saveOptimize;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class CuttingStatusRespVO {
@Schema(description = "排单ID")
private Long planId;
@Schema(description = "取消开料的大板编号")
private List<Long> goodsNo;
}
@@ -0,0 +1,57 @@
package com.cf.imes.module.executor.controller.admin.plan.saveOptimize;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.ToString;
import javax.validation.Valid;
import java.util.List;
@Schema(description = "管理后台 - 未排单的大板的数据信息")
@Data
@ToString(callSuper = true)
public class NotPlanGoodsReqVO {
// @Schema(description = "生产单ids")
// private List<Long> orderIds;
//
// @Schema(description = "生产单的大板ids")
// private List<Long> goodsIds;
//
//
// @Schema(description = "板材库对应的大板ids")
// private List<Long> plateGoodsIds;
@Schema(description = "生产单和大板的信息")
private List<OrderIds> orderIdList;
@Schema(description = "排单类型:1 混单排单,2 生产单排单", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer type;
@Schema(description = "混单过滤条件")
private List<Information> filter;
@Valid
@Data
public static class Information {
@Schema(description = "材质")
private Boolean material;
@Schema(description = "颜色")
private Boolean color;
@Schema(description = "长*宽")
private Boolean spec;
}
}
@@ -0,0 +1,87 @@
package com.cf.imes.module.executor.controller.admin.plan.saveOptimize;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.ToString;
import java.math.BigDecimal;
import java.util.List;
@Data
@ToString(callSuper = true)
public class NotPlanGoodsRespVO {
// @Schema(description = "生产单ids")
// private List<Long> orderIds;
//
//
// @Schema(description = "生产单的大板ids")
// private List<Long> goodsIds;
//
//
// @Schema(description = "板材库对应的大板ids")
// private List<Long> plateGoodsIds;
@Schema(description = "生产单和大板的信息")
private List<OrderIds> orderIdList;
// @Schema(description = "余料板ID")
// private List<Long> remainPlateIds;
@Schema(description = "商品ID-板材库对应的大板ID")
private Long goodsId;
@Schema(description = "商品名称")
private String goodsName;
@Schema(description = "商品材质")
private String material;
@Schema(description = "商品颜色")
private String color;
@Schema(description = "商品纹路")
private Boolean texture;
// @Schema(description = "宽")
// private BigDecimal width;
//
//
// @Schema(description = "高")
// private BigDecimal height;
//
//
@Schema(description = "")
private BigDecimal thickness;
// @Schema(description = "面积")
// private BigDecimal area;
@Schema(description = "小板数量")
private Integer plateNum;
@Schema(description = "大板数量")
private Integer goodsNum;
@Schema(description = "尺寸规格")
private String spec;
}
@@ -15,7 +15,7 @@ import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH
public class GoodsReqVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "4109")
@Schema(description = "主键-大板分类ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4109")
private Long id;
@@ -29,7 +29,7 @@ public class GoodsReqVO {
@Schema(description = "设计端商品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "832")
private Long rawGoodsId;
@Schema(description = "商品 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "243")
@Schema(description = "商品 ID-大板的实际ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "243")
private Long goodsId;
@Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "晨丰")
@@ -79,13 +79,13 @@ public class GoodsReqVO {
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
private LocalDateTime createTime;
@Schema(description = "更新时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] updateTime;
private LocalDateTime updateTime;
@@ -0,0 +1,55 @@
package com.cf.imes.module.executor.controller.admin.plan.vo;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class NotPlanOrderPlateRespVO {
// @Schema(description = "生产单id")
// private List<Long> orderId;
//
// @Schema(description = "生产单的大板ID-大板分类ID")
// private List<Long> id;
//
// @Schema(description = "商品id-板材库对应的ID")
// private Long goodsId;
@Schema(description = "生产单和大板的信息")
private List<OrderIds> orderIdList;
@Schema(description = "商品ID-板材库对应的大板ID")
private Long goodsId;
@Schema(description = "商品名称")
private String goodsName;
@Schema(description = "商品材质")
private String material;
@Schema(description = "商品颜色")
private String color;
@Schema(description = "")
private BigDecimal width;
@Schema(description = "")
private BigDecimal height;
@Schema(description = "")
private BigDecimal thickness;
@Schema(description = "商品纹路")
private Boolean texture;
@Schema(description = "商品品牌")
private String brand;
}
@@ -5,8 +5,6 @@ import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
@@ -32,6 +30,10 @@ public class OrderGoodsResp {
private BigDecimal height;
@Schema(description = "")
private BigDecimal thickness;
@Schema(description = "商品纹路")
private Boolean texture;
@Schema(description = "商品品牌")
private String brand;
@Schema(description = "面积")
private BigDecimal area;
@@ -3,12 +3,10 @@ package com.cf.imes.module.executor.controller.admin.plan.vo;
import com.cf.imes.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@@ -16,14 +14,12 @@ import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH
/**
* @author there
*/
@NoArgsConstructor
@Data
public class OrderPageReqVOCopy extends PageParam {
@Schema(description = "生产单id")
private Long orderId;
@Schema(description = "商品id")
private String goodsId;
@Schema(description = "自定义id")
private String defaultId;
@Schema(description = "客户")
@@ -49,12 +45,6 @@ public class OrderPageReqVOCopy extends PageParam {
@Schema(description = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
/*@Schema(description = "交付日期开始时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime beginDate;
@Schema(description = "交付日期结束时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime endDate;*/
@Schema(description = "长 小范围")
private BigDecimal longMinRang;
@Schema(description = "长 大范围")
@@ -64,4 +54,18 @@ public class OrderPageReqVOCopy extends PageParam {
@Schema(description = "宽 大范围")
private BigDecimal widthMaxRang;
// todo 目前商品ID的数据筛选只解决了非混单的情况(非混单,数据类型为Long即可,混单情况需要改变),混单数据筛选待解决
@Schema(description = "商品ID-板材库对应的大板ID")
private Long goodsId;
@Schema(description = "大板分类ID")
private List<Long> ids;
@Schema(description = "房间ID")
private List<Long> roomId;
@Schema(description = "柜体ID")
private List<Long> bodyId;
@Schema(description = "生产单ids")
private List<Long> orderIds;
}
@@ -24,6 +24,8 @@ import static com.cf.imes.framework.common.util.date.DateUtils.*;
public class OrderRespVOCopy {
@Schema(description = "生产单id")
private Long orderId;
@Schema(description = "生产单状态")
private Long status;
@Schema(description = "自定义单号")
private String defineId;
@Schema(description = "客户")
@@ -1,10 +1,12 @@
package com.cf.imes.module.executor.controller.admin.plan.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.cf.imes.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@@ -16,7 +18,12 @@ import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH
public class PlanPageReqVO extends PageParam {
@Schema(description = "排单号")
private String id;
private Long id;
@Schema(description = "是否翻页-true:上,false:下")
private Boolean isUp;
@Schema(description = "排序优先级")
private Integer sort;
@@ -1,13 +1,12 @@
package com.cf.imes.module.executor.controller.admin.plan.vo;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderRespVO;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.Data;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
import java.util.List;
@Schema(description = "管理后台 - 生产单开料排单 Response VO")
@Data
@@ -18,10 +17,6 @@ public class PlanRespVO {
@ExcelProperty("ID")
private Long id;
// @Schema(description = "排单号", requiredMode = Schema.RequiredMode.REQUIRED)
// @ExcelProperty("排单号")
// private String planNo;
@Schema(description = "排序优先级", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("排序优先级")
private Integer sort;
@@ -34,9 +29,6 @@ public class PlanRespVO {
@ExcelProperty("排单状态:0 新单,1 板材已申请,2 开料中,3 已开料")
private Integer status;
// @Schema(description = "是否支付:0 否,1 是", requiredMode = Schema.RequiredMode.REQUIRED)
// @ExcelProperty("是否支付:0 否,1 是")
// private Boolean isPay;
@Schema(description = "机台 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16707")
@ExcelProperty("机台 ID")
@@ -57,7 +49,7 @@ public class PlanRespVO {
@Schema(description = "排单对应的生产单的信息", requiredMode = Schema.RequiredMode.REQUIRED)
private List<PlanOrderRespVO> orderList;
@Schema(description = "板材信息列表", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "板材信息列表-大板信息", requiredMode = Schema.RequiredMode.REQUIRED)
private List<PlateInfoVO> plateInfoList;
@Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对")
@@ -80,4 +72,25 @@ public class PlanRespVO {
@ExcelProperty("生产时间")
private LocalDateTime produceTime;
@Schema(description = "优化大板片数")
private Long optimizeGoodsCount;
@Schema(description = "已开料的大板片数")
private Long cutGoodsCount;
@Schema(description = "总小板片数")
private Long plateNum;
@Schema(description = "未优化小板片数")
private Long unOptimizePlateCount;
@Schema(description = "已优化小板片数")
private Long optimizePlateCount;
}
@@ -2,12 +2,13 @@ package com.cf.imes.module.executor.controller.admin.plan.vo;
import com.cf.imes.framework.es.core.valid.CreateGroup;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - 生产单开料排单新增/修改 Request VO")
@Data
@@ -18,7 +19,6 @@ public class PlanSaveReqVO {
@Schema(description = "排序优先级", requiredMode = Schema.RequiredMode.REQUIRED)
//@NotNull(groups = CreateGroup.class,message = "排序优先级不能为空")
private Long sort;
@Schema(description = "排单类型:1 混单排单,2 生产单排单", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@@ -38,14 +38,10 @@ public class PlanSaveReqVO {
@NotNull(message = "计划时间不能为空", groups = CreateGroup.class)
private LocalDateTime planTime;
/*@Schema(description = "生产单id列表", requiredMode = Schema.RequiredMode.REQUIRED)
private List<Long> orderIds;*/
/*@Schema(description = "板件id列表")
private List<Long> plateIds;*/
@Schema(description = "生产单id与商品id 列表",requiredMode = Schema.RequiredMode.REQUIRED)
private List<Item> itemList;
// @Schema(description = "余料板ID")
// private List<Long> remainPlateIds;
@Schema(description = "备注")
@@ -59,6 +55,15 @@ public class PlanSaveReqVO {
@NotNull(message = "生产时间不能为空", groups = CreateGroup.class)
private LocalDateTime produceTime;
@Schema(description = "生产单id与商品id 列表",requiredMode = Schema.RequiredMode.REQUIRED)
private List<Item> itemList;
@Schema(description = "去除的大板分类ID",requiredMode = Schema.RequiredMode.REQUIRED)
private List<Long> deleteIds;
@Valid
@Data
public static class Item {
@@ -70,8 +75,13 @@ public class PlanSaveReqVO {
@Schema(description = "生产单id")
@NotNull
private Long orderId;
@Schema(description = "板材库大板id")
@NotNull
private Long goodsId;
@Schema(description = "余料板ID")
@NotNull
private Long remainPlateId;
}
}
@@ -13,7 +13,7 @@ import java.util.List;
public class PlateDetialRespVO {
@Schema(description = "板件ID", requiredMode = Schema.RequiredMode.REQUIRED)
private Long id;
private Long plateId;
@Schema(description = "房间ID", requiredMode = Schema.RequiredMode.REQUIRED)
@@ -35,10 +35,13 @@ public class PlateDetialRespVO {
private Long orderId;
@Schema(description = "商品ID", requiredMode = Schema.RequiredMode.REQUIRED)
private Long goodsId;
@Schema(description = "商品ID-大板分类ID", requiredMode = Schema.RequiredMode.REQUIRED)
private Long id;
@Schema(description = "大板实例ID", requiredMode = Schema.RequiredMode.REQUIRED)
private Long goodsId;
@Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED)
private String goodsName;
@@ -1,14 +1,15 @@
package com.cf.imes.module.executor.controller.admin.plan.vo;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
/**
* @author there
@@ -18,6 +19,16 @@ import java.math.BigDecimal;
@AllArgsConstructor
@NoArgsConstructor
public class PlateInfoVO {
@Schema(description = "生产单和大板的信息")
private List<OrderIds> orderIdList;
@Schema(description = "板材库对应的大板ID-大板实际ID")
private Long goodsId;
@Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板", requiredMode = Schema.RequiredMode.REQUIRED)
private String material;
@@ -40,7 +51,10 @@ public class PlateInfoVO {
@Schema(description = "颜色")
private String color;
@Schema(description = "数量")
@Schema(description = "数量-大板对应的小板数量")
private Integer count;
@Schema(description = "优化大板片数")
private Long optimizeGoodsCount;
}
@@ -49,7 +49,7 @@ public class OptimizationSavePlateReqVO {
private Integer type;
@Schema(description = "商品ID")
@Schema(description = "商品ID-大板的实际ID")
private Long goodsId;
@Schema(description = "纹路类型,0 正纹 1 可翻转 2 反纹")
@@ -1,14 +1,14 @@
package com.cf.imes.module.executor.controller.admin.plate.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.cf.imes.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.util.*;
import lombok.Data;
import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
import java.util.List;
/**
* @author Beal
@@ -173,6 +173,14 @@ public class PlateRespVO extends PageParam {
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "加工造型(槽)数")
private Integer sculptNum;
@Schema(description = "加工孔数")
private Integer holeNum;
@Schema(description = "板材颜色")
private String color;
@@ -0,0 +1,28 @@
package com.cf.imes.module.executor.dal.dataobject.goods;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Schema(description = "大板开料信息")
public class CutedBoardInfo {
@Schema(description = "已开料大板数量")
private Long cutedBoardNumber;
@Schema(description = "具体的开料大板编号")
private List<Long> cutedBoardList;
}
@@ -2,6 +2,7 @@ package com.cf.imes.module.executor.dal.dataobject.goods;
import com.cf.imes.framework.es.core.dal.ESDocument;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -9,6 +10,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.List;
@Data
@@ -23,7 +25,25 @@ public class OptimizeBoardModelDO extends ESDocument {
@Schema(description = "生产单id")
private Long orderId;
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
private List<Long> orderId;
@Schema(description = "大板的实际ID")
private Long goodsId;
@Schema(description = "生产单已优化小板数量")
private Long placeBlockNumber;
// 新的数据集需要去除
@Schema(description = "排单优化的大板数量")
private Long placeBoardNumber;
@Schema(description = "已开料大板数据集")
private CutedBoardInfo cutedBoardInfo;
@Schema(description = "大板原长")
@@ -1,11 +1,8 @@
package com.cf.imes.module.executor.dal.dataobject.orderGroup;
import com.cf.imes.framework.organ.core.db.OrganBaseDO;
import lombok.*;
import com.baomidou.mybatisplus.annotation.*;
import com.cf.imes.framework.mybatis.core.dataobject.BaseDO;
import java.math.BigDecimal;
import lombok.*;
/**
* 生产单加工组 DO
@@ -51,15 +48,15 @@ public class OrderGroupDO extends BaseDO {
*/
private String name;
/**
* 模块宽度
* 加工组宽度
*/
private Double width;
/**
* 模块高度
* 加工组高度
*/
private Double height;
/**
* 模块深度
* 加工组深度
*/
private Double depth;
/**
@@ -1,23 +1,10 @@
package com.cf.imes.module.executor.dal.dataobject.plate;
import com.cf.imes.framework.organ.core.db.OrganBaseDO;
import lombok.*;
import java.util.*;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.cf.imes.framework.mybatis.core.dataobject.BaseDO;
import lombok.*;
import java.math.BigDecimal;
/**
* 生产单板件 DO
@@ -55,7 +42,7 @@ public class PlateDO extends BaseDO {
*/
private String plateNo;
/**
* 板类型,0 层板 1 立板 2 背板
* 板类型,0 层板 1 立板 2 背板 3 自增板
*/
private Integer type;
/**
@@ -1,22 +1,21 @@
package com.cf.imes.module.executor.dal.mysql.goods;
import java.util.*;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsPageReqVO;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.NotPlanGoodsRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.GoodsReqVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderGoodsResp;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPageReqVOCopy;
import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO;
import com.cf.imes.module.executor.dal.dataobject.orderGroup.OrderGroupDO;
import org.apache.ibatis.annotations.Mapper;
import com.cf.imes.module.executor.controller.admin.goods.vo.*;
import org.apache.ibatis.annotations.Param;
import java.util.Collection;
import java.util.List;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId;
/**
@@ -51,7 +50,7 @@ public interface GoodsMapper extends BaseMapperX<GoodsDO> {
List<GoodsReqVO> selectGoodsList(@Param("orderId") Long orderId, @Param("organId") Long organId);
List<GoodsReqVO> selectGoodsListByOrderIds(@Param("orderIds") List<Long> orderIds, @Param("organId") Long organId);
List<GoodsReqVO> selectGoodsListByOrderIds(@Param("goodsIds") List<Long> goodsIds, @Param("organId") Long organId);
// 单个修改删除状态
@@ -82,12 +81,26 @@ public interface GoodsMapper extends BaseMapperX<GoodsDO> {
IPage<OrderGoodsResp> selectGoods(@Param("page") IPage page, @Param("goodsIds") List<Long> goodsIds, @Param("organId") Long organId);
default GoodsDO selectId(Long orderId, Long goodsId, Long organId) {
return selectOne(new LambdaQueryWrapperX<GoodsDO>()
// default GoodsDO selectId(Long orderId, Long goodsId, Long organId) {
// return selectOne(new LambdaQueryWrapperX<GoodsDO>()
// }
// default List<GoodsDO> selectGoodsPlateList(List<Long> goodIds, Long organId) {
// return selectList(new LambdaQueryWrapperX<GoodsDO>()
// .eq(GoodsDO::getOrganId, organId)
// .inIfPresent(GoodsDO::getOrderId, goodIds)
// .select(GoodsDO::getGoodsId,GoodsDO::getGoodsName, GoodsDO::getMaterial, GoodsDO::getColor, GoodsDO::getTexture,GoodsDO::getThickness, GoodsDO::getSpec));
// }
List<NotPlanGoodsRespVO> selectGoodsPlateList(@Param("goodIds") List<Long> goodIds,@Param("organId") Long organId);
default List<GoodsDO> selectListByGoodsId(Long goodsId, Long organId) {
return selectList(new LambdaQueryWrapperX<GoodsDO>()
.eq(GoodsDO::getOrganId, organId)
.eq(GoodsDO::getOrderId, orderId)
.eq(GoodsDO::getGoodsId, goodsId)
.eq(GoodsDO::getDeleted, 0));
.eq(GoodsDO::getDeleted, false)
.eq(GoodsDO::getGoodsId, goodsId));
}
// 根据生产单删除
@@ -101,4 +114,33 @@ public interface GoodsMapper extends BaseMapperX<GoodsDO> {
return delete(new LambdaQueryWrapperX<GoodsDO>()
.in(GoodsDO::getOrderId, orderId));
}
// List<GoodsDO> seleTestSQL(@Param("sql") String sql);
default List<GoodsDO> selectListByGoodsIdList(List<Long> goodsIds,List<Long> orderIds, Long organId) {
return selectList(new LambdaQueryWrapperX<GoodsDO>()
.eq(GoodsDO::getOrganId, organId)
.eq(GoodsDO::getDeleted, false)
.in(GoodsDO::getGoodsId, goodsIds)
.in(GoodsDO::getOrderId, orderIds));
}
List<GoodsDO> seleTestSQL(@Param("filed") String filed,@Param("goodsIds") List<Long> goodsIds ,@Param("organId") Long organId);
default GoodsDO selectGoodsId(Long orderId, Long goodsId, Long organId) {
return selectOne(new LambdaQueryWrapperX<GoodsDO>()
.eq(GoodsDO::getOrganId, organId)
.eq(GoodsDO::getDeleted, false)
.eq(GoodsDO::getGoodsId, goodsId)
.eq(GoodsDO::getOrderId, orderId)
.select(GoodsDO::getId));
}
}
@@ -13,15 +13,15 @@ import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderCountPro
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderOverdueRespVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPageReqVO;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderGoodsResp;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPageReqVOCopy;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderRespVOCopy;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.enums.OrderDeletedEnum;
import com.cf.imes.module.executor.enums.OrderStatusEnum;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Qualifier;
import javax.annotation.sql.DataSourceDefinition;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@@ -90,6 +90,7 @@ public interface OrderMapper extends BaseMapperX<OrderDO> {
IPage<OrderRespVOCopy> selectOrderPage(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper<OrderDO> wrapper);
// IPage<OrderRespVOCopy> selectOrderPage(@Param("page") IPage page,@Param("pageReqVO") OrderPageReqVOCopy pageReqVO, @Param("organId") Long organId);
Map<String, Object> selectDynamicSqlString(@Param("sqlStr") String sqlStr);
@@ -143,7 +144,7 @@ public interface OrderMapper extends BaseMapperX<OrderDO> {
List<OrderRespVOCopy> selectOrderListByIds(@Param("orderIds") List<OrderIds> orderIds, @Param("organId") Long organId);
List<Long> selectOrderIds(@Param(Constants.WRAPPER) Wrapper<OrderDO> wrapper);
IPage<OrderGoodsResp> selectOrderIds(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper<OrderDO> wrapper);
// 生产单预警统计
List<OrderOverdueRespVO> selectOrderNear(@Param("today") LocalDateTime today, @Param("orderDate") LocalDateTime orderDate, @Param("organId") Long organId);
@@ -214,4 +215,37 @@ public interface OrderMapper extends BaseMapperX<OrderDO> {
.eq(OrderDO::getDeleted, OrderDeletedEnum.DELETED.getStatus())
.lt(OrderDO::getUpdateTime, LocalDateTime.now().minusDays(30))).stream().map(OrderDO::getId).collect(Collectors.toList());
}
default int updateOrderListStatus(List<Long> orderIds, Integer status,Long organId) {
return update(new LambdaUpdateWrapper<OrderDO>()
.set(OrderDO::getStatus, status)
.in(OrderDO::getId, orderIds)
.eq(OrderDO::getDeleted, 0)
.eq(OrderDO::getOrganId, organId));
}
List<OrderDO> selectTestSQL(@Param("filed") String filed,@Param("orderIds") List<Long> orderIds,@Param("organId") Long organId);
default List<OrderDO> selectOrderIdsList(OrderPageReqVOCopy pageReqVO, List<Integer> statusList, Long organId) {
return selectList(new LambdaQueryWrapperX<OrderDO>()
.eqIfPresent(OrderDO::getOrganId, organId)
.eq(OrderDO::getDeleted, false)
.in(OrderDO::getStatus,statusList)
.likeIfPresent(OrderDO::getId,pageReqVO.getOrderId() != null ? pageReqVO.getOrderId().toString() : null)
.inIfPresent(OrderDO::getId,pageReqVO.getOrderIds())
.likeIfPresent(OrderDO::getCustomOrderNo,pageReqVO.getDefaultId())
.likeIfPresent(OrderDO::getCustomer,pageReqVO.getConsignee())
.likeIfPresent(OrderDO::getAddress,pageReqVO.getConsigneeAddress())
.betweenIfPresent(OrderDO::getCreateTime,pageReqVO.getCreateTime())
.select(OrderDO::getId));
}
}
@@ -6,13 +6,12 @@ import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisti
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsReqVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsStatusRespVO;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.enums.OrderDeletedEnum;
import com.cf.imes.module.executor.enums.OrderStatusEnum;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
/**
@@ -27,7 +26,7 @@ public interface OrderStatisticsMapper extends BaseMapperX<OrderDO> {
*/
default Integer selectOrderCount() {
return Math.toIntExact(selectCount(new LambdaQueryWrapperX<OrderDO>()
.eq(OrderDO::getDeleted, 0)));
.eq(OrderDO::getDeleted, OrderDeletedEnum.NOT_DELETED.getStatus())));
}
/**
@@ -36,6 +35,7 @@ public interface OrderStatisticsMapper extends BaseMapperX<OrderDO> {
*/
default Integer selectOrderCountToday() {
return Math.toIntExact(selectCount(new LambdaQueryWrapperX<OrderDO>()
.eq(OrderDO::getDeleted, OrderDeletedEnum.NOT_DELETED.getStatus())
.eq(OrderDO::getOrderDate, LocalDate.now())));
}
@@ -46,7 +46,9 @@ public interface OrderStatisticsMapper extends BaseMapperX<OrderDO> {
*/
default Integer selectOrderCountTodayFinish() {
return Math.toIntExact(selectCount(new LambdaQueryWrapperX<OrderDO>()
.between(OrderDO::getFinishTime, LocalDateTime.of(LocalDate.now(), LocalTime.MIN), LocalDateTime.of(LocalDate.now(), LocalTime.MAX))));
.eq(OrderDO::getDeleted, OrderDeletedEnum.NOT_DELETED.getStatus())
.eq(OrderDO::getStatus, OrderStatusEnum.FINISH_PRODUCTION.getStatus())
.eq(OrderDO::getFinishTime, LocalDate.now())));
}
/**
@@ -55,13 +57,14 @@ public interface OrderStatisticsMapper extends BaseMapperX<OrderDO> {
*/
default Integer selectOrderCountProduce() {
return Math.toIntExact(selectCount(new LambdaQueryWrapperX<OrderDO>()
.eq(OrderDO::getDeleted, OrderDeletedEnum.NOT_DELETED.getStatus())
.eq(OrderDO::getStatus, OrderStatusEnum.IN_PRODUCTION.getStatus())));
}
/**
* 生产中生产平方数
*
* @param organId
* @param
* @return
*/
Integer selectOrderSquareProduce();
@@ -4,18 +4,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderModuleRespVO;
import com.cf.imes.module.executor.controller.admin.order.vo.product.OrderBodyRespVO;
import com.cf.imes.module.executor.controller.admin.order.vo.product.OrderRoomBodyRespVO;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO;
import com.cf.imes.module.executor.dal.dataobject.orderGroup.OrderGroupDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Set;
@@ -1,25 +1,18 @@
package com.cf.imes.module.executor.dal.mysql.orderItem;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderModuleRespVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlatesDetailRespVO;
import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRespVO;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.OptimizeRemainPlate;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomBodyList;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPackReqVO;
import com.cf.imes.module.executor.controller.admin.plate.vo.PlateDetailReqVO;
import com.cf.imes.module.executor.controller.admin.plate.vo.PlateDetailRespVO;
import com.cf.imes.module.executor.controller.admin.plate.vo.PlateRespVO;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO;
import com.cf.imes.module.executor.dal.dataobject.orderModuleExtra.OrderModuleExtraDO;
import com.cf.imes.module.executor.dal.dataobject.remainplaten.RemainPlateDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import java.util.Collection;
import java.util.List;
@@ -85,4 +78,29 @@ public interface OrderItemMapper extends BaseMapperX<OrderItemDO> {
return delete(new LambdaQueryWrapperX<OrderItemDO>()
.in(OrderItemDO::getOrderId, orderId));
}
List<OrderRoomBodyList> selectRoomBodyByOrderId( @Param("orderIds") List<Long> orderIds, @Param("organId") Long organId);
default List<OrderItemDO> selectPlateIdList(List<Long> plateIds, Long organId) {
return selectList(new LambdaQueryWrapperX<OrderItemDO>()
.eq(OrderItemDO::getOrganId,organId)
.inIfPresent(OrderItemDO::getPlateId, plateIds)
.select(OrderItemDO::getBodyId,OrderItemDO::getRoomId,OrderItemDO::getGroupId));
}
default List<OrderItemDO> selectPartsList(List<Long> partIds, Long organId) {
return selectList(new LambdaQueryWrapperX<OrderItemDO>()
.eq(OrderItemDO::getOrganId,organId)
.inIfPresent(OrderItemDO::getPlateId, partIds)
.select(OrderItemDO::getNum));
}
}
@@ -1,19 +1,20 @@
package com.cf.imes.module.executor.dal.mysql.orderParts;
import java.util.*;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsPageReqVO;
import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRespVO;
import com.cf.imes.module.executor.controller.admin.orderParts.vo.PartGoodsRespVO;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPartsRespVO;
import com.cf.imes.module.executor.dal.dataobject.orderGroup.OrderGroupDO;
import com.cf.imes.module.executor.dal.dataobject.orderParts.OrderPartsDO;
import org.apache.ibatis.annotations.Mapper;
import com.cf.imes.module.executor.controller.admin.orderParts.vo.*;
import org.apache.ibatis.annotations.Param;
import java.util.Collection;
import java.util.List;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId;
@@ -84,4 +85,18 @@ public interface OrderPartsMapper extends BaseMapperX<OrderPartsDO> {
return delete(new LambdaQueryWrapperX<OrderPartsDO>()
.in(OrderPartsDO::getOrderId, orderId));
}
List<OrderPartsDO> selectTestSql(@Param("filed") String filed,@Param("partIds") List<Long> partIds,@Param("organId") Long organId);
default List<OrderPartsDO> selectPartIds(List<Long> orderIds, Long organId) {
return selectList(new LambdaQueryWrapperX<OrderPartsDO>()
.eq(OrderPartsDO::getOrganId,organId)
.eq(OrderPartsDO::getDeleted,false)
.in(OrderPartsDO::getOrderId,orderIds)
.select(OrderPartsDO::getId));
}
}
@@ -1,21 +1,21 @@
package com.cf.imes.module.executor.dal.mysql.plan;
import java.util.*;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsReqVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.*;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO;
import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO;
import com.cf.imes.module.executor.dal.dataobject.planitem.PlanItemDO;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Mapper;
import com.cf.imes.module.executor.controller.admin.plan.vo.*;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId;
/**
@@ -100,4 +100,19 @@ public interface PlanMapper extends BaseMapperX<PlanDO> {
* @return
*/
List<OrderPlanStatisticsAreaRespVO> selectPlanAreaGroupByCreateTime(@Param("req") OrderStatisticsReqVO reqVO);
List<PlanDO> seleTestSQL(@Param("filed") String filed,@Param("planId") Long planId,@Param("organId") Long organId);
List<PlanDO> selectPlanIds(@Param("updateTime") String updateTime,@Param("sort") Long sort,@Param("organId") Long organId,@Param("planId") Long planId);
List<PlanDO> selectPlanIdsFalse(@Param("updateTime") String updateTime,@Param("sort") Long sort,@Param("organId") Long organId,@Param("planId") Long planId);
// List<PlanDO> seleTestSQL(@Param("sql") String sql);
}
@@ -1,17 +1,14 @@
package com.cf.imes.module.executor.dal.mysql.planitem;
import java.util.*;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.PlanOrderRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.PlateInfoVO;
import com.cf.imes.module.executor.dal.dataobject.planitem.PlanItemDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 生产单开料排单明细 Mapper
*
@@ -1,23 +1,29 @@
package com.cf.imes.module.executor.dal.mysql.plate;
import java.math.BigDecimal;
import java.util.*;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.cf.imes.framework.common.enums.OrderPlateTypeEnum;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.module.executor.controller.admin.plan.bo.GoodsNum;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds;
import com.cf.imes.module.executor.controller.admin.plan.vo.*;
import com.cf.imes.module.executor.controller.admin.plate.vo.PlateGoodsIdVO;
import com.cf.imes.module.executor.controller.admin.plate.vo.PlateGoodsRespVO;
import com.cf.imes.module.executor.controller.admin.plate.vo.PlatePageReqVO;
import com.cf.imes.module.executor.controller.admin.plate.vo.PlateRespVO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
import org.apache.ibatis.annotations.Mapper;
import com.cf.imes.module.executor.controller.admin.plate.vo.*;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId;
/**
@@ -120,7 +126,9 @@ public interface PlateMapper extends BaseMapperX<PlateDO> {
List<PlateGoodsIdVO> selectPlateGoodsListByList(@Param("plates") List<Long> goodsIdList, @Param("orderId") Long orderId, @Param("organId") Long organId);
List<PlatePage> selectGoodsPage( @Param("orderIds") List<Long> orderIds, @Param("organId") Long organId);
// List<NotPlanOrderPlateRespVO> selectGoodsPage( @Param("orderIds") List<Long> orderIds, @Param("organId") Long organId);
List<NotPlanOrderPlateRespVO> selectGoodsPage( @Param(Constants.WRAPPER) Wrapper<PlateDO> wrapper);
IPage<OrderGoodsResp> selectGoodsList(@Param("page") IPage<OrderGoodsResp> page,@Param("goodsIds") List<Long> goodsIds,@Param("organId") Long organId);
@@ -152,9 +160,67 @@ public interface PlateMapper extends BaseMapperX<PlateDO> {
.eq(PlateDO::getOrganId, organId)
.eqIfPresent(PlateDO::getOrderId, orderId));
}
default List<PlateDO> selectGoodsPlateList(List<Long> goodIds, Long organId) {
return selectList(new LambdaQueryWrapperX<PlateDO>()
.eq(PlateDO::getOrganId,organId)
.inIfPresent(PlateDO::getGoodsId, goodIds));
}
List<PlateDetialRespVO> selectPlateListByGoodIds(@Param("goodIds") List<Long> goodIds,@Param("organId") Long organId);
List<PlateInfoVO> selectPlateArea(@Param("orderIdsList") List<OrderIds> orderIdsList,@Param("organId") Long organId);
default List<PlateDO> selectPlateByPlateNo(List<Long> plateNo, Long organId) {
return selectList(new LambdaQueryWrapperX<PlateDO>()
.eq(PlateDO::getOrganId,organId)
.inIfPresent(PlateDO::getPlateNo, plateNo)
.select(PlateDO::getOrderId));
}
default List<PlateDO> selectPlateListByGoodsIds(List<Long> deleteIds, Long organId) {
return selectList(new LambdaQueryWrapperX<PlateDO>()
.eq(PlateDO::getOrganId,organId)
.inIfPresent(PlateDO::getGoodsId, deleteIds)
.select(PlateDO::getPlateNo));
}
// 批量删除
default int deleteBatch(Collection<?> orderId) {
return delete(new LambdaQueryWrapperX<PlateDO>()
.in(PlateDO::getOrderId, orderId));
}
List<PlateRespVO> selectTestSQL(@Param("filed") String filed, @Param("field2") String field2,@Param("goodsIdList") List<Long> goodsIdList,@Param("organId") Long organId);
default List<PlateDO> selectPlateIdList(List<Long> goodsIdList, Long organId) {
return selectList(new LambdaQueryWrapperX<PlateDO>()
.eq(PlateDO::getOrganId,organId)
.eq(PlateDO::getDeleted,false)
.inIfPresent(PlateDO::getGoodsId,goodsIdList)
.eq(PlateDO::getType, OrderPlateTypeEnum.SELFINCREASINGBOARD.getType())
.select(PlateDO::getId));
}
// List<PlateDO> selectTestSQL(@Param("sql") String sql);
}
@@ -4,11 +4,10 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.OptimizeRemainPlate;
import com.cf.imes.module.executor.controller.admin.remainplate.vo.RemainPlatePageReqVO;
import com.cf.imes.module.executor.dal.dataobject.processStep.ProcessStepDO;
import com.cf.imes.module.executor.dal.dataobject.remainplaten.RemainPlateDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Collection;
import java.util.List;
@@ -59,4 +58,9 @@ public interface RemainPlateMapper extends BaseMapperX<RemainPlateDO> {
.in(RemainPlateDO::getId, ids)
.eq(RemainPlateDO::getOrganId, organId));
}
List<RemainPlateDO> selectTestSQL(@Param("filed") String filed,@Param("planId") Long planId,@Param("organId") Long organId);
// List<RemainPlateDO> selectTestSQL(@Param("sql") String sql);
}
@@ -1,32 +0,0 @@
package com.cf.imes.module.executor.enums;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* 排单状态
*
* @author Gqr
* @since 2024/6/7 14:25
*/
@RequiredArgsConstructor
@Getter
public enum OrderPlanStatusEnum {
NEW(0, "新单"),
APPLY(1, "板材已申请"),
OPENING(2, "开料中"),
OPENED(3, "已开料");
/**
* 类型编码
*/
private final Integer code;
/**
* 描述
*/
private final String desc;
}
@@ -5,6 +5,7 @@ import com.cf.imes.module.report.api.template.ReportTemplateApi;
import com.cf.imes.module.system.api.application.ApplicationApi;
import com.cf.imes.module.system.api.dataSource.DataSourceApi;
import com.cf.imes.module.system.api.machine.MachineApi;
import com.cf.imes.module.system.api.organ.OrganApi;
import com.cf.imes.module.system.api.process.ProcessApi;
import com.cf.imes.module.system.api.process.ProcessGroupApi;
import com.cf.imes.module.system.api.user.AdminUserApi;
@@ -17,6 +18,6 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@EnableFeignClients(clients = {AdminUserApi.class, MachineApi.class, DictDataApi.class,AdminUserApi.class,
FileApi.class, ProcessGroupApi.class, FileApi.class, DataSourceApi.class, ApplicationApi.class, ProcessApi.class, ReportTemplateApi.class})
FileApi.class, ProcessGroupApi.class, FileApi.class, DataSourceApi.class, ApplicationApi.class, ProcessApi.class, ReportTemplateApi.class, OrganApi.class})
public class RpcConfiguration {
}
@@ -1,10 +1,13 @@
package com.cf.imes.module.executor.service.optimizeplan;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderSource;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.CuttingStatusRespVO;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.SavePlanPlateResultReqVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.*;
import com.cf.imes.module.executor.dal.dataobject.goods.OptimizeBoardModelDO;
import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -18,19 +21,17 @@ public interface OptimizePlanService {
Boolean addRemain(AddRemainReqVO vo);
Boolean savePlanPlateResult(SavePlanPlateResult result);
Boolean commit(Long planId);
Boolean commit(Long planId, List<Long> goodsNo);
Boolean updateCuttingStatus(CuttingStatusRespVO respVO);
Boolean endCutting(Long planId);
OptimizeParamResVO getOptimizeParam(Long planId);
OptimizeParamRespVO getOptimizePlanParam(Long planId);
Map<String, Object> getLabelDataSourceValue(GetSourceDataReq req);
OrderSource getOrderSource(Long orderId, Long planId, Long machineId);
OrderSource getOrderSource(Long orderId, Long planId, Long machineId,List<Long> ids);
OrderSource getOrderSourceByOrderId(Long orderId);
@@ -41,4 +42,10 @@ public interface OptimizePlanService {
List<OrderModelDO> getPlateModel(Long orderId);
List<OptimizeBoardModelDO> buildBoardByOrderIds(Collection<Long> orderIds, String index, Integer size);
String deleteTest(List<Long> id);
}
@@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.FieldValue;
import co.elastic.clients.elasticsearch.core.*;
@@ -12,26 +11,20 @@ import co.elastic.clients.elasticsearch.core.search.Hit;
import com.alibaba.fastjson.JSON;
import com.cf.imes.framework.common.enums.OrderStatusEnum;
import com.cf.imes.framework.common.enums.PlanStatusEnum;
import com.cf.imes.framework.common.enums.ProcessProcessingTypeEnum;
import com.cf.imes.framework.common.enums.RemainTypeEnum;
import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.framework.common.util.json.JsonUtils;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.es.core.service.ESDocumentService;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.cf.imes.framework.security.core.LoginUser;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderSource;
import com.cf.imes.module.executor.controller.admin.plan.bo.ProcessGroupList;
import com.cf.imes.module.executor.controller.admin.plan.bo.ProcessStepAreaIds;
import com.cf.imes.module.executor.controller.admin.plan.bo.ProcessStepSalaryIds;
import com.cf.imes.module.executor.controller.admin.plan.dto.Material;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.OptimizeRemainPlate;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPackReqVO;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPartsRespVO;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.SavePlanPlateResultReqVO;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.*;
import com.cf.imes.module.executor.controller.admin.plan.vo.*;
import com.cf.imes.module.executor.controller.admin.plate.vo.PlateDetailVO;
import com.cf.imes.module.executor.dal.dataobject.goods.CutedBoardInfo;
import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO;
import com.cf.imes.module.executor.dal.dataobject.goods.OptimizeBoardModelDO;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
@@ -41,8 +34,6 @@ import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO;
import com.cf.imes.module.executor.dal.dataobject.planitem.PlanItemDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
import com.cf.imes.module.executor.dal.dataobject.processStep.ProcessStepDO;
import com.cf.imes.module.executor.dal.dataobject.remainplaten.OutlineDTO;
import com.cf.imes.module.executor.dal.dataobject.remainplaten.PointDTO;
import com.cf.imes.module.executor.dal.dataobject.remainplaten.RemainPlateDO;
import com.cf.imes.module.executor.dal.mysql.goods.GoodsMapper;
import com.cf.imes.module.executor.dal.mysql.order.OrderMapper;
@@ -54,33 +45,32 @@ import com.cf.imes.module.executor.dal.mysql.processStep.ProcessStepMapper;
import com.cf.imes.module.executor.dal.mysql.processStepItem.ProcessStepItemMapper;
import com.cf.imes.module.executor.dal.mysql.remainplaten.RemainPlateMapper;
import com.cf.imes.module.executor.enums.ErrorCodeConstants;
import com.cf.imes.module.executor.util.RandomUtils;
import com.cf.imes.module.executor.util.RectangleChecker;
import com.cf.imes.module.infra.api.file.FileApi;
import com.cf.imes.module.infra.api.file.dto.FileCreateReqDTO;
import com.cf.imes.module.system.api.dataSource.DataSourceApi;
import com.cf.imes.module.system.api.machine.MachineApi;
import com.cf.imes.module.system.api.process.ProcessApi;
import com.cf.imes.module.system.api.process.dto.ProcessDTO;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR;
import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.UNKNOWN;
import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.*;
import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_NOT_EXISTS;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PLAN_NOT_EXISTS;
import org.springframework.transaction.annotation.Transactional;
import static com.cf.imes.module.system.enums.ErrorCodeConstants.INSUFFICIENT_PERMISSIONS;
/**
* @author there
@@ -163,55 +153,200 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
return Boolean.TRUE;
}
@Override
public Boolean savePlanPlateResult(SavePlanPlateResult result) {
return null;
// PlanDO planDO = planMapper.selectById(result.getPlanId());
// if (Objects.isNull(planDO)) {
// throw exception(PLAN_NOT_EXISTS);
// }
// try {
// String placeDateFileUrlSource = planDO.getPlaceDateFileUrl();
// String placeOrderFileUrlSource = planDO.getPlaceOrderFileUrl();
// if (StrUtil.isNotBlank(placeDateFileUrlSource)) {
// fileApi.deleteFileByPath(placeDateFileUrlSource).checkError();
// }
// if (StrUtil.isNotBlank(placeOrderFileUrlSource)) {
// fileApi.deleteFileByPath(placeOrderFileUrlSource).checkError();
// }
// FileCreateReqDTO fileCreateReqDTO = new FileCreateReqDTO();
//
// fileCreateReqDTO.setContent(result.getPlaceData().getBytes());
// fileCreateReqDTO.setName(result.getPlaceData().getOriginalFilename());
// String placeDateFileUrl = fileApi.createFile(fileCreateReqDTO).getCheckedData();
//
// fileCreateReqDTO.setContent(result.getPlaceOrder().getBytes());
// fileCreateReqDTO.setName(result.getPlaceOrder().getOriginalFilename());
// String placeOrderFileUrl = fileApi.createFile(fileCreateReqDTO).getCheckedData();
//
// PlanDO updateDO = PlanDO.builder()
// .id(result.getPlanId())
// .placeDateFileUrl(placeOrderFileUrl)
// .placeOrderFileUrl(placeDateFileUrl)
// .build();
// planMapper.updateById(updateDO);
//
// } catch (IOException e) {
// throw exception(UNKNOWN);
// }
// return Boolean.TRUE;
}
@Override
public Boolean commit(Long planId) {
@Transactional(rollbackFor = Exception.class)
public Boolean commit(Long planId, List<Long> goodsNo) {
PlanDO planDO = planMapper.selectById(planId);
if (Objects.isNull(planDO)) {
throw exception(PLAN_NOT_EXISTS);
}
planMapper.updateById(PlanDO.builder()
.id(planId)
.status(PlanStatusEnum.DURINGCUTTING.getStatus())
.build());
// todo 目前只解决了非混单的情况,混单情况待解决
List<OptimizeBoardModelDO> optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 10);
OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0);
List<Long> plateNo = new ArrayList<>();
// 创建一个列表存储 BlockPlaceInfo 对象,将优化的小板信息拿出,获取到小板编号,查询生产单,修改生产单的状态
List<BlockPlaceInfo> outputList = new ArrayList<>();
ObjectMapper mapper = new ObjectMapper();
try {
// 解析 JSON 字符串
JsonNode jsonArray = mapper.readTree(optimizeBoardModelDO.getBlockPlaceInfo());
// 遍历 JSON 数组并提取所需字段
if (jsonArray.isArray()) {
for (JsonNode jsonNode : jsonArray) {
Long bi = jsonNode.get("bi").asLong();
Long bo = jsonNode.get("bo").asLong();
outputList.add(new BlockPlaceInfo(bi,bo));
}
}
} catch (JsonProcessingException e) {
e.printStackTrace();
}
for (Long goods : goodsNo) {
plateNo.addAll(outputList.stream().filter(f -> f.getBi().equals(goods)).map(BlockPlaceInfo::getBo).distinct().toList());
}
List<PlateDO> plateDOS = plateMapper.selectPlateByPlateNo(plateNo.stream().distinct().toList(), getUserOrganId());
List<Long> orderIds = plateDOS.stream().map(PlateDO::getOrderId).distinct().toList();
// 修改生产单的状态
orderMapper.updateOrderListStatus(orderIds,OrderStatusEnum.IN_PRODUCTION.getStatus(),getUserOrganId());
CutedBoardInfo cutedBoardInfo = optimizeBoardModelDO.getCutedBoardInfo();
// 获取原排单的开料大板数 + 新增的开料大板数
long cutedBoardNumber = cutedBoardInfo.getCutedBoardNumber() ;
cutedBoardNumber += goodsNo.size();
// 获取原排单的已开料的大板编号
List<Long> cutedBoardList = cutedBoardInfo.getCutedBoardList() == null ? new ArrayList<>() : cutedBoardInfo.getCutedBoardList();
// 将新开料的大板编号添加到已开料的大板编号中
cutedBoardList.addAll(goodsNo);
// 将需要更新更新的数据更新到原数据中
cutedBoardInfo.setCutedBoardNumber(cutedBoardNumber);
cutedBoardInfo.setCutedBoardList(cutedBoardList);
// 更新开料相关的数据
HashMap<String, Object> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("cutedBoardInfo",cutedBoardInfo);
try {
esDocumentService.updateById(ORDER_REMAIN_PLATE_MODEL, optimizeBoardModelDO.getId(), HashMap.class, objectObjectHashMap);
}catch (IOException e) {
log.error(e.getMessage());
throw new ServiceException(ES_ERROR_UPDATE);
}
if(cutedBoardNumber > 0){
planDO.setStatus(PlanStatusEnum.OPENING.getStatus());
planMapper.updateById(planDO);
}
if(optimizeBoardModelDO.getBoardCount() == cutedBoardNumber){
planDO.setStatus(PlanStatusEnum.OPENED.getStatus());
planDO.setProduceTime(LocalDateTime.now());
planMapper.updateById(planDO);
}
return Boolean.TRUE;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateCuttingStatus(CuttingStatusRespVO respVO) {
Long planId = respVO.getPlanId();
List<Long> goodsNo = respVO.getGoodsNo();
// LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
// assert loginUser != null;
//
// if(!loginUser.getIsSupAdmin()){
//
// throw exception(INSUFFICIENT_PERMISSIONS);
//
// }
PlanDO planDO = planMapper.selectById(planId);
if (planDO == null) {
throw exception(PLAN_NOT_EXISTS);
}
// todo 目前只解决了非混单的情况,混单情况待解决
List<OptimizeBoardModelDO> optimizeBoardModelDOS = buildBoardByPlanId(planId, ORDER_REMAIN_PLATE_MODEL, 99);
OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0);
CutedBoardInfo cutedBoardInfo = optimizeBoardModelDO.getCutedBoardInfo() == null ? new CutedBoardInfo() : optimizeBoardModelDO.getCutedBoardInfo();
if(cutedBoardInfo.getCutedBoardNumber() != null) {
// 已经开料的大板信息
List<Long> cutedBoardList = cutedBoardInfo.getCutedBoardList();
// 开料的大板数量
long cutedBoardNumber = cutedBoardInfo.getCutedBoardNumber();
// 移除取消开料的数据
cutedBoardList.removeAll(goodsNo);
// 减去取消开料的大板数量
cutedBoardNumber -= (goodsNo.isEmpty() ? 0 : goodsNo.size());
// 将需要更新更新的数据更新到原数据中
cutedBoardInfo.setCutedBoardNumber(cutedBoardNumber);
cutedBoardInfo.setCutedBoardList(cutedBoardList);
// 更新开料相关的数据
HashMap<String, Object> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("cutedBoardInfo", cutedBoardInfo);
try {
esDocumentService.updateById(ORDER_REMAIN_PLATE_MODEL, optimizeBoardModelDO.getId(), HashMap.class, objectObjectHashMap);
} catch (IOException e) {
log.error(e.getMessage());
throw new ServiceException(ES_ERROR_UPDATE);
}
if(cutedBoardInfo.getCutedBoardNumber() == 0){
planDO.setStatus(PlanStatusEnum.NOCUTTING.getStatus());
planDO.setProduceTime(null);
planMapper.updateById(planDO);
}
if(planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus()) && cutedBoardInfo.getCutedBoardNumber() > 0 && cutedBoardInfo.getCutedBoardNumber() < optimizeBoardModelDO.getBoardCount() ){
planDO.setStatus(PlanStatusEnum.OPENING.getStatus());
planDO.setProduceTime(null);
planMapper.updateById(planDO);
}
}
// todo 待确认,是否要达到这样的需求 : 生产单的状态也应该更改,如果大板变为未开料,生产单对应的状态应该变为已排单(这时取消开料对应的大板对应的生产单应该在其他排单中不存在,可修改)
return Boolean.TRUE;
}
@@ -224,7 +359,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
}
planMapper.updateById(PlanDO.builder()
.id(planId)
.status(PlanStatusEnum.OPENEDMATERIAL.getStatus())
.status(PlanStatusEnum.OPENED.getStatus())
.produceTime(LocalDateTime.now())
.build());
@@ -281,93 +416,6 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
}
@Override
public OptimizeParamResVO getOptimizeParam(Long planId) {
//小板列表
List<PlateParam> plates = plateMapper.selectPlateList(planId);
//余料规格列表
List<RemainPlateDO> remainPlateDOS = remainPlateMapper.selectList(new LambdaQueryWrapperX<RemainPlateDO>().eq(RemainPlateDO::getPlanId, planId));
//余料板规格
List<OptimizeParamResVO.RawSize> rawSizes = new ArrayList<>();
List<Integer> remainPlateCount = new ArrayList<>();
if (CollectionUtil.isNotEmpty(remainPlateDOS)) {
Map<String, List<OutlineDTO>> map = remainPlateDOS.stream()
.map(e -> OutlineDTO.builder()
.list(JsonUtils.parseArray(e.getOutLineJson(), PointDTO.class))
.length(e.getLength())
.width(e.getWidth())
.build()
)
.filter(e -> e.getList().size() == 4 && RectangleChecker.checkRectangle(e.getList()))
.collect(Collectors.groupingBy(e -> e.getLength() + "," + e.getWidth()));
map.entrySet().forEach(e -> {
String[] split = e.getKey().split(",");
BigDecimal length = new BigDecimal(split[0]);
BigDecimal width = new BigDecimal(split[1]);
List<OutlineDTO> outlines = e.getValue();
rawSizes.add(OptimizeParamResVO.RawSize.builder()
.length(length)
.width(width)
.x(new BigDecimal(outlines.get(0).getList().get(0).getX()))
.y(new BigDecimal(outlines.get(0).getList().get(0).getY()))
.build());
remainPlateCount.add(outlines.size());
});
}
//大板规格
/**
* select * from order_goods a
* left join order_plate b on a.goods_id = b.goods_id
* left join order_item c on b.id = c.plate_id
* left join order_plan_item d on c.id = d.item_id
* where d.plan_id = 1769638780093857792
*/
MPJLambdaWrapper<GoodsDO> wrapper = new MPJLambdaWrapperX<GoodsDO>()
.distinct()
.select(GoodsDO::getId, GoodsDO::getWidth, GoodsDO::getHeight)
.leftJoin(PlateDO.class, PlateDO::getGoodsId, GoodsDO::getGoodsId)
.leftJoin(OrderItemDO.class, OrderItemDO::getPlanId, PlateDO::getPlateNo)
.leftJoin(PlanItemDO.class, PlanItemDO::getItemId, OrderItemDO::getId)
.eq(PlanItemDO::getPlanId, planId);
GoodsDO goodsDO = goodsMapper.selectJoinOne(GoodsDO.class, wrapper);
rawSizes.add(OptimizeParamResVO.RawSize.builder()
.width(goodsDO.getWidth())
.length(goodsDO.getHeight())
.x(new BigDecimal("0"))
.y(new BigDecimal("0"))
.build());
return OptimizeParamResVO.builder()
.plates(plates)
.rawSizes(rawSizes)
.remainPlateCount(remainPlateCount)
.build();
}
@Override
public OptimizeParamRespVO getOptimizePlanParam(Long planId) {
OptimizeParamRespVO optimizePlanParam = planMapper.getOptimizePlanParam(planId);
if (Objects.isNull(optimizePlanParam)) {
return RandomUtils.randomPojo(OptimizeParamRespVO.class);
}
//暂时先mock
ArrayList<Material> list = new ArrayList<>();
list.add(RandomUtils.randomPojo(Material.class));
list.add(RandomUtils.randomPojo(Material.class));
ArrayList<PlateDetailVO> plateDetailVOS = new ArrayList<>();
plateDetailVOS.add(RandomUtils.randomPojo(PlateDetailVO.class));
plateDetailVOS.add(RandomUtils.randomPojo(PlateDetailVO.class));
plateDetailVOS.add(RandomUtils.randomPojo(PlateDetailVO.class));
if (CollectionUtil.isNotEmpty(optimizePlanParam.getPlateList())) {
optimizePlanParam.getPlateList().get(0).setPlateDetailList(plateDetailVOS);
}
optimizePlanParam.setMaterialList(list);
return optimizePlanParam;
}
@Override
public Map<String, Object> getLabelDataSourceValue(GetSourceDataReq req) {
@@ -383,9 +431,9 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
}
@Override
public OrderSource getOrderSource(Long orderId, Long planId, Long machineId) {
if (!Objects.isNull(orderId) && !Objects.isNull(planId)) {
throw exception(154112, "生产单id与排单id只能传一个");
public OrderSource getOrderSource(Long orderId, Long planId, Long machineId,List<Long> ids) {
if (!Objects.isNull(orderId) && !Objects.isNull(planId) && !Objects.isNull(ids)) {
throw exception(154112, "生产单id与排单id与大板分类ID只能传一个");
}
OrderSource orderSource;
if (ObjectUtil.isNotNull(orderId)) {
@@ -398,6 +446,11 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
orderSource.setMachineDTO(machineApi.getMachineDetail(machineId).getCheckedData());
return orderSource;
}
if (ObjectUtil.isNotNull(ids)) {
orderSource = getOrderSourceByGoodId(ids);
orderSource.setMachineDTO(machineApi.getMachineDetail(machineId).getCheckedData());
return orderSource;
}
throw exception(ErrorCodeConstants.SOURCE_NOT_EXITS_ERROR);
}
@@ -476,7 +529,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
throw exception(PLAN_NOT_EXISTS);
}
MPJLambdaWrapper<OrderItemDO> wrapper = new MPJLambdaWrapperX<OrderItemDO>()
.select(OrderItemDO::getOrderId)
.select(OrderItemDO::getOrderId,OrderItemDO::getPlateId)
.rightJoin(PlanItemDO.class, PlanItemDO::getItemId, OrderItemDO::getId)
.eq(PlanItemDO::getPlanId, planId)
.isNotNull(OrderItemDO::getId);
@@ -488,9 +541,14 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
// List<GoodsDO> goodsDOS = goodsMapper.selectList(new LambdaQueryWrapperX<GoodsDO>().in(GoodsDO::getOrderId, orderIds));
List<GoodsReqVO> goodsDOS = goodsMapper.selectGoodsListByOrderIds(orderIds,getUserOrganId());
List<PlateDetialRespVO> plateDOS = plateMapper.selectPlateDetialListByIds(orderIds,getUserOrganId());
List<Long> plateIds = orderItemDOS.stream().map(OrderItemDO::getPlateId).distinct().toList();
List<Long> goodsIds = plateMapper.selectBatchIds(plateIds).stream().map(PlateDO::getGoodsId).distinct().toList();
List<GoodsReqVO> goodsDOS = goodsMapper.selectGoodsListByOrderIds(goodsIds,getUserOrganId());
List<PlateDetialRespVO> plateDOS = plateMapper.selectPlateDetialListByIds(plateIds,getUserOrganId());
for (PlateDetialRespVO plateDetailsRespVO : plateDOS) {
String name = "";
@@ -544,38 +602,102 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
}
public OrderSource getOrderSourceByGoodId(List<Long> ids) {
// PlanDO planDO = planMapper.selectById(planId);
// if (Objects.isNull(planDO)) {
// throw exception(PLAN_NOT_EXISTS);
// }
// List<GoodsDO> goodsDOS = goodsMapper.selectBatchIds(goodIds);
List<GoodsReqVO> goodsReqVOS = goodsMapper.selectJoinList(GoodsReqVO.class, new MPJLambdaWrapperX<GoodsDO>()
.leftJoin(RemainPlateDO.class, RemainPlateDO::getGoodsId, GoodsDO::getId)
.selectAll(GoodsDO.class)
.selectAs(RemainPlateDO::getId,"remainId")
.isNotNull(PlanItemDO::getId)
.eq(GoodsDO::getOrganId, getUserOrganId())
.in(GoodsDO::getId, ids));
List<Long> orderIds = goodsReqVOS.stream().map(GoodsReqVO::getOrderId).distinct().toList();
List<OrderDO> orderDOS = orderMapper.selectBatchIds(orderIds);
List<PlateDetialRespVO> plateDetialRespVOS = plateMapper.selectPlateListByGoodIds(ids, getUserOrganId());
for (PlateDetialRespVO plateDetailsRespVO : plateDetialRespVOS) {
String name = "";
if(!plateDetailsRespVO.getProcessGroupLists().isEmpty()) {
for (ProcessGroupList groupNameList : plateDetailsRespVO.getProcessGroupLists()) {
// 去除最后的逗号
name += groupNameList.getGroupName() + ",";
}
name = name.substring(0, name.length() - 1);
}
plateDetailsRespVO.setProcessGroupName(name);
plateDetailsRespVO.setGoodsId(goodsReqVOS
.stream()
.filter(f->f.getId().equals(plateDetailsRespVO.getId()))
.map(GoodsReqVO::getGoodsId)
.findAny().orElse(null));
}
// 造型数据的尺寸长度
Integer orderModelSize = plateDetialRespVOS.size();
List<OrderModelDO> orderModelDOS = buildRespByOrderIds(orderIds, ORDER_PLATE_MODEL, orderModelSize);
// // 查询生产单对应的配件信息
// List<PrintOrderPartsRespVO> printOrderPartsRespVOS = orderPartsMapper.selectPartList(orderIds, getUserOrganId());
//
// // 查询生产单对应的包裹信息
// List<PrintOrderPackReqVO> printOrderPackReqVOS = orderItemMapper.selectPackList(orderIds, getUserOrganId());
return OrderSource.builder()
.orderList(orderDOS)
.goodsList(goodsReqVOS)
.plateList(plateDetialRespVOS)
.plateModels(orderModelDOS)
.build();
}
// 保存优化后的数据
@Override
@Transactional(rollbackFor = Exception.class)
public void saveOptimizationResults(SavePlanPlateResultReqVO req) {
// // 判断当前的大板数据是否已经优化,有优化,更新,没有,新增
// if (req.getOptimizeBoardModelDOS().get(0).getIsOptimized().equals(true)) {
// try {
// // 更新大板的优化数据
// BulkResponse bulkResponse = esDocumentService.bulkUpdate(ORDER_REMAIN_PLATE_MODEL, req.getOptimizeBoardModelDOS());
// boolean errors = bulkResponse.errors();
// if (errors) {
// log.error(bulkResponse.items().toString());
// throw new ServiceException(500, "未知异常");
// }
// } catch (Exception e) {
// e.printStackTrace();
// log.error(e.getMessage());
// throw new RuntimeException(e);
// }
// }
// else {
// 先根据排单查找是否有优化数据,如果有,删除
List<Long> planIds = req.getOptimizeBoardModelDOS().stream().map(OptimizeBoardModelDO::getPlanId).toList();
// 保存优化后的大板数据
batchSaveBoardModel(req.getOptimizeBoardModelDOS());
List<OptimizeBoardModelDO> optimizeBoardModelDOS = buildBoardByPlanIds(planIds, ORDER_REMAIN_PLATE_MODEL, planIds.size());
if(!optimizeBoardModelDOS.isEmpty()){
// }
deleteByPlanId(planIds,ORDER_REMAIN_PLATE_MODEL);
}
// 保存优化后的大板数据
batchSaveBoardModel(req.getOptimizeBoardModelDOS());
if (CollectionUtil.isNotEmpty(req.getOptimizeRemainPlates())) {
ArrayList<RemainPlateDO> remainPlateDOS = new ArrayList();
ArrayList<RemainPlateDO> remainPlateDOS = new ArrayList<>();
for (OptimizeRemainPlate optimizeRemainPlate : req.getOptimizeRemainPlates()) {
remainPlateDOS.add(RemainPlateDO.builder()
@@ -603,16 +725,6 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
}
remainPlateMapper.updateBatch(remainPlateDOS);
// for (RemainPlateDO remainPlateDO : remainPlateDOS) {
//
//// if(remainPlateDO.getId() != null){
//// remainPlateMapper.insert(remainPlateDO);
////
//// }
//
// remainPlateMapper.updateById(remainPlateDO);
//
// }
}
@@ -622,24 +734,17 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
if (CollectionUtil.isNotEmpty(req.getAddPlateIds())) {
List<PlateDetialRespVO> addPlates = req.getPlateList().stream()
.filter(m -> req.getAddPlateIds().contains(m.getId()))
.map(m -> m.setId(null))
.filter(m -> req.getAddPlateIds().contains(m.getPlateId()))
.map(m -> m.setPlateId(null))
.collect(Collectors.toList());
// List<Long> collect = req.getPlateList().stream().map(m -> m.getId()).collect(Collectors.toList());
// List<Long> addPlateIds = req.getAddPlateIds().stream().filter(m -> !collect.contains(m)).collect(Collectors.toList());
// List<PlateDetialRespVO> addPlates = req.getPlateList().stream()
// .filter(m -> addPlateIds.contains(m.getId()))
// .map(m->m.setId(null))
// .collect(Collectors.toList());
// 批量新增小板信息
List<PlateDO> plateDOS = BeanUtils.toBean(addPlates, PlateDO.class);
plateMapper.insertBatch(plateDOS);
// 批量新增生产单明细表信息
ArrayList<OrderItemDO> orderItemDOS = new ArrayList();
ArrayList<OrderItemDO> orderItemDOS = new ArrayList<>();
for (PlateDetialRespVO plateDetialRespVO : req.getPlateList()) {
orderItemDOS.add(OrderItemDO.builder()
@@ -649,7 +754,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
// .groupId(Long.valueOf(plateDetialRespVO.getProcessGroupId()))
.orderId(plateDetialRespVO.getOrderId())
.type(1)
.plateId(plateDetialRespVO.getId())
.plateId(plateDetialRespVO.getPlateId())
.build());
}
@@ -782,7 +887,9 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
}
}
private List<OptimizeBoardModelDO> buildBoardByOrderIds(Collection<Long> orderIds, String index, Integer size) {
@Override
public List<OptimizeBoardModelDO> buildBoardByOrderIds(Collection<Long> orderIds, String index, Integer size) {
List<FieldValue> fieldValues = orderIds.stream().map(FieldValue::of).toList();
SearchRequest.Builder builder = new SearchRequest.Builder();
builder.index(index);
@@ -802,5 +909,59 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
}
public List<OptimizeBoardModelDO> buildBoardByPlanIds(Collection<Long> planIds, String index, Integer size) {
List<FieldValue> fieldValues = planIds.stream().map(FieldValue::of).toList();
SearchRequest.Builder builder = new SearchRequest.Builder();
builder.index(index);
builder.size(size);
builder.query(q -> q.terms(b -> b.field("planId").terms(e -> e.value(fieldValues))));
try {
SearchResponse<OptimizeBoardModelDO> search = elasticsearchClient.search(builder.build(), OptimizeBoardModelDO.class);
List<Hit<OptimizeBoardModelDO>> hits = search.hits().hits();
if (CollectionUtil.isNotEmpty(hits)) {
return hits.stream().map(Hit::source).collect(Collectors.toList());
}
return new ArrayList<>();
} catch (IOException e) {
log.error(e.getMessage());
throw new ServiceException(INTERNAL_SERVER_ERROR);
}
}
public void deleteByPlanId(List<Long> planIds, String index) {
List<FieldValue> fieldValues = planIds.stream().map(FieldValue::of).toList();
DeleteByQueryRequest.Builder builder = new DeleteByQueryRequest.Builder();
builder.index(index);
builder.query(q -> q.terms(b -> b.field("planId").terms(e -> e.value(fieldValues))));
try {
DeleteByQueryResponse response = elasticsearchClient.deleteByQuery(builder.build());
log.info("Deleted {} documents with planId {}", response.deleted(), planIds);
} catch (IOException e) {
log.error("Error deleting documents with planId {}: {}", planIds, e.getMessage());
throw new ServiceException(ES_ERROR_DELETE);
}
}
@Override
public String deleteTest(List<Long> orderIds) {
Long a = 1801515154546884609L;
List<OptimizeBoardModelDO> optimizeBoardModelDOS = buildBoardByPlanId(a, ORDER_REMAIN_PLATE_MODEL, 999);
System.out.println("哈哈哈哈哈1 "+optimizeBoardModelDOS);
return null;
}
}
@@ -72,4 +72,12 @@ public interface OrderStatisticsService {
* @return
*/
Map<String, Object> getOrderPlateAreaGroup(OrderStatisticsReqVO reqVO);
/**
* 大板数量分组统计
*
* @param reqVO
* @return
*/
Map<String, Object> getBigPlateCountGroup(OrderStatisticsReqVO reqVO);
}
@@ -1,24 +1,43 @@
package com.cf.imes.module.executor.service.order;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.FieldValue;
import co.elastic.clients.elasticsearch._types.SortOrder;
import co.elastic.clients.elasticsearch._types.aggregations.Aggregate;
import co.elastic.clients.elasticsearch._types.aggregations.CalendarInterval;
import co.elastic.clients.elasticsearch._types.aggregations.DateHistogramAggregation;
import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.json.JsonData;
import co.elastic.clients.util.NamedValue;
import com.cf.imes.framework.common.enums.OrderStatusEnum;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderGoodsPlateRespVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsAreaRespVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsReqVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsStatusRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanStatisticsAreaRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderPlanStatisticsCountRespVO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO;
import com.cf.imes.module.executor.dal.mysql.order.OrderStatisticsMapper;
import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper;
import com.cf.imes.module.executor.dal.mysql.plate.OrderPlateStatisticsMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateGoodMapper;
import com.cf.imes.module.executor.enums.OrderStatisticsUnit;
import com.cf.imes.module.executor.service.optimizeplan.OptimizePlanService;
import com.cf.imes.module.system.api.dict.DictDataApi;
import com.cf.imes.module.system.api.dict.dto.DictDataRespDTO;
import com.cf.imes.module.system.enums.DictTypeConstants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
@@ -40,6 +59,7 @@ import java.util.stream.Collectors;
*/
@Service
@Validated
@Slf4j
public class OrderStatisticsServiceImpl implements OrderStatisticsService {
@Resource
private OrderStatisticsMapper orderStatisticsMapper;
@@ -53,9 +73,21 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService {
@Resource
private DictDataApi dictDataApi;
@Resource
private PlateGoodMapper plateGoodMapper;
@Resource
private ElasticsearchClient client;
// 常用的字段key
private static final String DATELIST_FIELD_NAME = "dateList";
private static final String SERIES_FIELD_NAME = "series";
private static final String ORDER_REMAIN_PLATE_MODEL_CREATE_TIME_FIELDNAME = "createTime";
private static final String ORDER_REMAIN_PLATE_MODEL_GOODS_GROUP_NAME = "goods_group";
private static final String ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME = "goods_count";
private static final String DATE_TIME_FORMATTER_PATTERN_YEAR_MONTH = "yyyy-M";
private static final String DATE_TIME_FORMATTER_PATTERN_YEAR_MONTH_DAY = "yyyy-M-d";
private static final String ORDER_REMAIN_PLATE_MODEL_GOODS_ID_NAME = "goodsId";
@Override
public Integer orderCount() {
@@ -206,18 +238,19 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService {
// 所有的日期集合
List<String> dateList = getDateList(reqVO);
// 查询时间段内数量最多的小板,排序列出数量前10的goods_id
// 查询时间段内数量最多的小板,列出数量前10的goods_id
List<Long> topTenCountGoodsId = orderPlateStatisticsMapper.selectPlateCountList(reqVO).stream()
.sorted(Comparator.comparingLong(OrderGoodsPlateRespVO::getOrderCount).reversed())
.map(OrderGoodsPlateRespVO::getGoodsId)
.limit(10)
.collect(Collectors.toList());
.toList();
// 前十goods_id基于时间分组
Map<String, List<OrderGoodsPlateRespVO>> orderGoodsPlateRespMap = orderPlateStatisticsMapper.selectTopTenPlateCountListGroupByOrderDate(topTenCountGoodsId, reqVO).stream()
.sorted(Comparator.naturalOrder())
.collect(Collectors.groupingBy(OrderGoodsPlateRespVO::getOrderDate, LinkedHashMap::new, Collectors.toList()));
Map<String, List<OrderGoodsPlateRespVO>> orderGoodsPlateRespMap = new HashMap<>();
if (CollUtil.isNotEmpty(topTenCountGoodsId)) {
orderGoodsPlateRespMap = orderPlateStatisticsMapper.selectTopTenPlateCountListGroupByOrderDate(topTenCountGoodsId, reqVO).stream()
.sorted(Comparator.naturalOrder())
.collect(Collectors.groupingBy(OrderGoodsPlateRespVO::getOrderDate, LinkedHashMap::new, Collectors.toList()));
}
// 获取所有商品{goodsId:respvo},根据top10排序
Map<Long, OrderGoodsPlateRespVO> goodsMap = new LinkedHashMap<>();
@@ -225,7 +258,7 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService {
List<OrderGoodsPlateRespVO> list = orderGoodsPlateRespMap.values().stream()
.flatMap(List::stream)
.filter(vo -> vo.getGoodsId().equals(id))
.collect(Collectors.toList());
.toList();
if (!list.isEmpty()) {
// goodsId相同,其他属性任取
goodsMap.put(id, list.get(0));
@@ -277,18 +310,19 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService {
// 所有的日期集合
List<String> dateList = getDateList(reqVO);
// 查询时间段内面积最多的小板,排序列出前10面积的goods_id
// 查询时间段内面积最多的小板,列出前10面积的goods_id
List<Long> topTenCountGoodsId = orderPlateStatisticsMapper.selectPlateAreaList(reqVO).stream()
.sorted(Comparator.comparing(OrderGoodsPlateRespVO::getOrderArea).reversed())
.map(OrderGoodsPlateRespVO::getGoodsId)
.limit(10)
.collect(Collectors.toList());
.toList();
Map<String, List<OrderGoodsPlateRespVO>> orderGoodsPlateRespMap = new HashMap<>();
if (CollUtil.isNotEmpty(topTenCountGoodsId)) {
// 前十goods_id基于时间分组
orderGoodsPlateRespMap = orderPlateStatisticsMapper.selectTopTenPlateAreaListGroupByOrderDate(topTenCountGoodsId, reqVO).stream()
.sorted(Comparator.naturalOrder())
.collect(Collectors.groupingBy(OrderGoodsPlateRespVO::getOrderDate, LinkedHashMap::new, Collectors.toList()));
}
// 前十goods_id基于时间分组
Map<String, List<OrderGoodsPlateRespVO>> orderGoodsPlateRespMap = orderPlateStatisticsMapper.selectTopTenPlateAreaListGroupByOrderDate(topTenCountGoodsId, reqVO).stream()
.sorted(Comparator.naturalOrder())
.collect(Collectors.groupingBy(OrderGoodsPlateRespVO::getOrderDate, LinkedHashMap::new, Collectors.toList()));
// 获取所有商品{goodsId:respvo},根据top10排序
Map<Long, OrderGoodsPlateRespVO> goodsMap = new LinkedHashMap<>();
@@ -296,7 +330,7 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService {
List<OrderGoodsPlateRespVO> list = orderGoodsPlateRespMap.values().stream()
.flatMap(List::stream)
.filter(vo -> vo.getGoodsId().equals(id))
.collect(Collectors.toList());
.toList();
if (!list.isEmpty()) {
// goodsId相同,其他属性任取
goodsMap.put(id, list.get(0));
@@ -341,6 +375,184 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService {
return resultMap;
}
@Override
public Map<String, Object> getBigPlateCountGroup(OrderStatisticsReqVO reqVO) {
Map<String, Object> resultMap = new LinkedHashMap<>();
Integer unit = reqVO.getUnit();
// 所有的日期集合
List<String> dateList = getDateList(reqVO);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
SearchResponse<Map> response;
try {
// 查询创建时间段内,数量最多的goods_id前十
SearchRequest searchRequest = new SearchRequest.Builder()
.size(0)
.index(OptimizePlanService.ORDER_REMAIN_PLATE_MODEL)
.query(q -> q.range(r -> r.field(ORDER_REMAIN_PLATE_MODEL_CREATE_TIME_FIELDNAME)
.gte(JsonData.of(reqVO.getCreateTime()[0].format(dateTimeFormatter)))
.lte(JsonData.of(reqVO.getCreateTime()[1].format(dateTimeFormatter))))
)
.aggregations(ORDER_REMAIN_PLATE_MODEL_GOODS_GROUP_NAME,
agg -> agg.terms(terms -> terms.field(ORDER_REMAIN_PLATE_MODEL_GOODS_ID_NAME).size(10).order(new NamedValue<>(ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME, SortOrder.Desc)))
.aggregations(ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME, sumAgg -> sumAgg.sum(sum -> sum.field("boardCount")))
)
.build();
response = client.search(searchRequest, Map.class);
Map<String, Aggregate> goodsCountAggMap = response.aggregations();
Aggregate goodsCountAgg = goodsCountAggMap.get(ORDER_REMAIN_PLATE_MODEL_GOODS_GROUP_NAME);
List<Long> goodsIds = new ArrayList<>();
// 构建map{日期:{goodsId、count}}
Map<String, List<OrderGoodsPlateRespVO>> goodsDateGroupMap = new HashMap<>();
/**
* 获取数量最大前十的goodsId列表
*/
goodsCountAgg.lterms().buckets().array().forEach(e -> goodsIds.add(e.key()));
if (CollUtil.isNotEmpty(goodsIds)) {
List<FieldValue> goodsIdFieldValueList = goodsIds.stream().map(FieldValue::of).toList();
// 查询创建时间段内,数量最多的goods_id前十下的数据,按goods_id和日期分组
SearchRequest dateGroupRequest = new SearchRequest.Builder()
.size(0)
.index(OptimizePlanService.ORDER_REMAIN_PLATE_MODEL)
.query(q -> q.range(r -> r.field(ORDER_REMAIN_PLATE_MODEL_CREATE_TIME_FIELDNAME)
.gte(JsonData.of(reqVO.getCreateTime()[0].format(dateTimeFormatter)))
.lte(JsonData.of(reqVO.getCreateTime()[1].format(dateTimeFormatter))))
)
.query(q -> q.bool(b -> b.must(m -> m.terms(t -> t.field(ORDER_REMAIN_PLATE_MODEL_GOODS_ID_NAME).terms(tv -> tv.value(goodsIdFieldValueList))))))
.query(q -> q.match(m -> m.field("organId").query(SecurityFrameworkUtils.getUserOrganId())))
.aggregations(ORDER_REMAIN_PLATE_MODEL_GOODS_GROUP_NAME,
agg -> agg.terms(terms -> terms.field(ORDER_REMAIN_PLATE_MODEL_GOODS_ID_NAME).order(new NamedValue<>(ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME, SortOrder.Desc)))
.aggregations("date_group", dateAgg -> dateAgg.dateHistogram(date -> getDateHistogram(unit, date.field(ORDER_REMAIN_PLATE_MODEL_CREATE_TIME_FIELDNAME))))
.aggregations(ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME, sumAgg -> sumAgg.sum(sum -> sum.field("boardCount")))
)
.build();
response = client.search(dateGroupRequest, Map.class);
Map<String, Aggregate> goodsDateCountAggMap = response.aggregations();
Aggregate goodsDateAgg = goodsDateCountAggMap.get(ORDER_REMAIN_PLATE_MODEL_GOODS_GROUP_NAME);
goodsDateAgg.lterms().buckets().array().forEach(goodsDateAggBucket -> {
Long goodsId = goodsDateAggBucket.key();
// todo 目前没有发现好的es统计月周的方式,先把年月日查出来转周,后续优化
String dateStr = dateToWeekMonth(goodsDateAggBucket.aggregations().get("date_group").dateHistogram().buckets().array().get(0).keyAsString(), unit);
double goodsCount = goodsDateAggBucket.aggregations().get(ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME).sum().value();
OrderGoodsPlateRespVO vo = OrderGoodsPlateRespVO.builder().goodsId(goodsId).orderDate(dateStr).orderCount((int) goodsCount).build();
List<OrderGoodsPlateRespVO> orderGoodsPlateRespVOS = goodsDateGroupMap.get(dateStr);
if (ObjectUtil.isNotNull(orderGoodsPlateRespVOS)) {
orderGoodsPlateRespVOS.add(vo);
} else {
ArrayList<OrderGoodsPlateRespVO> goodsPlateRespVOS = new ArrayList<>();
goodsPlateRespVOS.add(vo);
goodsDateGroupMap.put(dateStr, goodsPlateRespVOS);
}
});
}
// 遍历所有goods_id
List<Map<String, Object>> series = new ArrayList<>();
for (Long goodsId : goodsIds) {
Map<String, Object> seriesItem = new HashMap<>();
int[] countArr = new int[dateList.size()];
// 遍历完整的日期范围
int index = 0;
for (String dateStr : dateList) {
// 查找匹配的goodsId
List<OrderGoodsPlateRespVO> orderGoodsPlateRespVOS = goodsDateGroupMap.get(dateStr);
int count = 0;
if (orderGoodsPlateRespVOS != null) {
count = orderGoodsPlateRespVOS.stream()
.filter(respVO -> Objects.equals(goodsId, respVO.getGoodsId()))
.map(OrderGoodsPlateRespVO::getOrderCount)
.findFirst().orElse(0);
}
countArr[index++] = count;
}
seriesItem.put("data", countArr);
seriesItem.put("id", goodsId);
// 材质-商品名称-颜色-纹理-宽-高-厚-品牌
List<PlateGoodDO> plateGoodDOList = plateGoodMapper.selectList(new LambdaQueryWrapperX<PlateGoodDO>().eq(PlateGoodDO::getGoodsId, goodsId));
if (CollUtil.isEmpty(plateGoodDOList)) {
// 没有对应大板不展示
log.error("[getBigPlateCountGroup][统计大板数量,查询大板{} 不存在]", goodsId);
continue;
}
// 任意取一个类型
PlateGoodDO plateGoodDO = plateGoodDOList.get(0);
seriesItem.put("name", plateGoodDO.getMaterial() + "-" + plateGoodDO.getGoodsName() +
"-" + plateGoodDO.getColor() + "-" + getTextureFromDict(plateGoodDO) + "-" + stripTrailingZeros(BigDecimal.valueOf(plateGoodDO.getWidth())) +
"×" + stripTrailingZeros(BigDecimal.valueOf(plateGoodDO.getHeight())) + "×" + stripTrailingZeros(BigDecimal.valueOf(plateGoodDO.getThickness())) + "-" + plateGoodDO.getBrand());
series.add(seriesItem);
}
resultMap.put(DATELIST_FIELD_NAME, dateList.stream().map(date -> generateDateRangeAxis(date, unit)).toList());
resultMap.put(SERIES_FIELD_NAME, series);
} catch (IOException e) {
log.error("[getBigPlateCountGroup][统计大板数量异常:{}]", e.getMessage(), e);
}
return resultMap;
}
/**
* 根据纹路枚举获取字典中纹路描述
* @param plateGoodDO
* @return
*/
private String getTextureFromDict(PlateGoodDO plateGoodDO) {
// 获取纹路描述
DictDataRespDTO grainDTO = dictDataApi.getDictData(DictTypeConstants.GRAIN_TYPE, String.valueOf(plateGoodDO.getTexture())).getData();
if (ObjectUtil.isNotNull(grainDTO)) {
return grainDTO.getLabel();
} else {
return "";
}
}
/**
* 根据统计维度获取es分组的dateHistogram
*
* @return
*/
private DateHistogramAggregation.Builder getDateHistogram(Integer unit, DateHistogramAggregation.Builder builder) {
switch (OrderStatisticsUnit.fromValue(unit)) {
case QUARTER:
return builder.calendarInterval(CalendarInterval.Quarter).format("yyyy-Q");
case MONTH:
return builder.calendarInterval(CalendarInterval.Month).format(DATE_TIME_FORMATTER_PATTERN_YEAR_MONTH);
case DAY, WEEK:
default:
return builder.calendarInterval(CalendarInterval.Day).format(DATE_TIME_FORMATTER_PATTERN_YEAR_MONTH_DAY);
}
}
/**
* 年月日转年月周
*
* @param dateStr
* @return
*/
private String dateToWeekMonth(String dateStr, Integer unit) {
if (OrderStatisticsUnit.WEEK.getValue().equals(unit)) {
LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(DATE_TIME_FORMATTER_PATTERN_YEAR_MONTH_DAY));
// 年月
String outDateStr = date.format(DateTimeFormatter.ofPattern(DATE_TIME_FORMATTER_PATTERN_YEAR_MONTH));
// 计算从月份第一天到当前日期经过了多少周
LocalDate monthStart = date.with(TemporalAdjusters.firstDayOfMonth());
long weeksInMonth = ChronoUnit.WEEKS.between(monthStart, date) + 1;
return outDateStr + "-" + weeksInMonth;
}
return dateStr;
}
/**
* 获取日期区间格式下的所有日期字符串
* 1、reqVO设置机构id
@@ -372,8 +584,8 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService {
endTime = now;
switch (OrderStatisticsUnit.fromValue(reqVO.getUnit())) {
case QUARTER:
// 从now往前的2
startTime = now.minusYears(2);
// 从now往前的1
startTime = now.minusYears(1);
break;
case MONTH:
// 包含now往前的12个月
@@ -419,22 +631,17 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService {
startDate = startDate.plusMonths(3);
break;
case MONTH:
dateStr = startDate.format(DateTimeFormatter.ofPattern("yyyy-M"));
dateStr = startDate.format(DateTimeFormatter.ofPattern(DATE_TIME_FORMATTER_PATTERN_YEAR_MONTH));
// 加一月
startDate = startDate.plusMonths(1);
break;
case WEEK:
// 使用自定义格式表示月份
dateStr = startDate.format(DateTimeFormatter.ofPattern("yyyy-M"));
// 计算从月份第一天到当前日期经过了多少周
LocalDate monthStart = startDate.with(TemporalAdjusters.firstDayOfMonth());
long weeksInMonth = ChronoUnit.WEEKS.between(monthStart, startDate) + 1;
dateStr = dateStr + "-" + weeksInMonth;
dateStr = startDate.format(DateTimeFormatter.ofPattern("yyyy-M-W"));
// 加一周
startDate = startDate.plusWeeks(1);
break;
case DAY:
dateStr = startDate.format(DateTimeFormatter.ofPattern("yyyy-M-d"));
dateStr = startDate.format(DateTimeFormatter.ofPattern(DATE_TIME_FORMATTER_PATTERN_YEAR_MONTH_DAY));
// 加一天
startDate = startDate.plusDays(1);
break;
@@ -1,12 +1,15 @@
package com.cf.imes.module.executor.service.plan;
import java.util.*;
import javax.validation.*;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.*;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderRespVO;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomBodyList;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.NotPlanGoodsReqVO;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.NotPlanGoodsRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.*;
import javax.validation.Valid;
import java.util.List;
import java.util.Map;
/**
* 生产单开料排单 Service 接口
@@ -21,7 +24,7 @@ public interface PlanService {
* @param createReqVO 创建信息
* @return 编号
*/
Long createPlan(@Valid PlanSaveReqVO createReqVO);
Map<Long,Long> createPlan(@Valid PlanSaveReqVO createReqVO);
/**
* 更新生产单开料排单
@@ -33,9 +36,9 @@ public interface PlanService {
/**
* 删除生产单开料排单
*
* @param id 编号
* @param ids 编号
*/
Boolean deletePlan(Long id);
Boolean deletePlan(List<Long> ids);
/**
* 获得生产单开料排单
@@ -75,5 +78,9 @@ public interface PlanService {
List<PlateResList> getPlateList(List<Long> planIds);
List<OrderRoomBodyList> getOrderRoomBody(List<Long> orderIds);
List<NotPlanOrderPlateRespVO> getOrderPlateList(OrderPageReqVOCopy pageReqVO);
List<NotPlanGoodsRespVO> getNotOptimizeGoodsList(NotPlanGoodsReqVO reqVO);
}
@@ -1,27 +1,39 @@
package com.cf.imes.module.executor.service.plan;
import cn.hutool.core.collection.CollectionUtil;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.FieldValue;
import co.elastic.clients.elasticsearch.core.DeleteByQueryRequest;
import co.elastic.clients.elasticsearch.core.DeleteByQueryResponse;
import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.Hit;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import com.cf.imes.framework.common.enums.PlanFilterTypeEnum;
import com.cf.imes.framework.common.enums.PlanStatusEnum;
import com.cf.imes.framework.common.util.json.JsonUtils;
import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.cf.imes.framework.mybatis.core.query.QueryWrapperX;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderRespVO;
import com.cf.imes.module.executor.controller.admin.plan.bo.GoodsNum;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds;
import com.cf.imes.module.executor.controller.admin.plate.vo.PlateRespVO;
import com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomBodyList;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.BlockPlaceInfo;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.NotPlanGoodsReqVO;
import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.NotPlanGoodsRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.*;
import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO;
import com.cf.imes.module.executor.dal.dataobject.goods.OptimizeBoardModelDO;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO;
import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO;
import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO;
import com.cf.imes.module.executor.dal.dataobject.planitem.PlanItemDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
import com.cf.imes.module.executor.dal.mysql.goods.GoodsMapper;
@@ -29,36 +41,37 @@ import com.cf.imes.module.executor.dal.mysql.module.ModuleMapper;
import com.cf.imes.module.executor.dal.mysql.order.OrderMapper;
import com.cf.imes.module.executor.dal.mysql.orderBody.OrderBodyMapper;
import com.cf.imes.module.executor.dal.mysql.orderItem.OrderItemMapper;
import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper;
import com.cf.imes.module.executor.dal.mysql.planitem.PlanItemMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.executor.enums.OrderStatusEnum;
import com.cf.imes.module.executor.service.optimizeplan.OptimizePlanService;
import com.cf.imes.module.system.api.machine.MachineApi;
import com.cf.imes.module.system.api.machine.dto.CuttingRespDTO;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
import com.cf.imes.module.executor.controller.admin.plan.vo.*;
import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper;
import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.ES_ERROR_DELETE;
import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR;
import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.cf.imes.framework.common.util.string.SearchUtil.insertSeparator;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.*;
import static com.cf.imes.framework.common.util.string.SearchUtil.insertSeparator;
import static com.cf.imes.module.system.enums.ErrorCodeConstants.NO_PRODUCTION_ORDER_INFORMATION_AVAILABLE;
import static com.cf.imes.module.system.enums.ErrorCodeConstants.THE_BOARD_HAS_BEEN_CUT_INTO_PIECES;
/**
* 生产单开料排单 Service 实现类
@@ -67,6 +80,7 @@ import static com.cf.imes.framework.common.util.string.SearchUtil.insertSeparato
*/
@Service
@Validated
@Slf4j
public class PlanServiceImpl implements PlanService {
@Resource
@@ -99,104 +113,276 @@ public class PlanServiceImpl implements PlanService {
@Resource
private IdentifierGenerator identifierGenerator;
String ORDER_REMAIN_PLATE_MODEL = "imes_order_remain_plate_model";
@Resource
private ElasticsearchClient elasticsearchClient;
@Resource
private OptimizePlanService optimizePlanService;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createPlan(PlanSaveReqVO createReqVO) {
public Map<Long,Long> createPlan(PlanSaveReqVO createReqVO) {
// todo 目前只考虑了非混单的情况,混单的情况待考虑
List<PlanSaveReqVO.Item> itemList = createReqVO.getItemList();
// 插入
long sort = System.currentTimeMillis();
PlanDO plan = BeanUtils.toBean(createReqVO, PlanDO.class);
// plan.setIsPay(Boolean.FALSE);
plan.setSort(0L);
// plan.setPlanNo(identifierGenerator.nextId(null).toString());
String orderNos = itemList.stream().map(PlanSaveReqVO.Item::getOrderId).distinct().toList().toString();
plan.setOrderNos(orderNos);
plan.setProduceTime(null);
planMapper.insert(plan);
// 修改对应的生产单的状态为 生产中
List<Long> orderIds = JSON.parseArray(orderNos).toJavaList(Long.class);
ArrayList<PlanDO> planDOS = new ArrayList<>();
List<GoodsNum> goodsNums = plateMapper.selectGoodsNum(orderIds, getUserOrganId());
ArrayList<PlanItemDO> planItemDOS = new ArrayList<>();
for (Long orderId : orderIds) {
Map<Long,Long> goodsPlanId = new HashMap<>();
// 传入的生产单的大板数量
int size1 = itemList.stream().filter(f -> Objects.equals(f.getOrderId(), orderId)).map(PlanSaveReqVO.Item::getId).distinct().toList().size();
// 当前生产单对应的大板数量
List<Long> list = goodsNums.stream().filter(f -> Objects.equals(f.getOrderId(), orderId)).map(GoodsNum::getGoodsNum).toList();
Map<Long, List<PlanSaveReqVO.Item>> groupedItems = itemList.stream()
.collect(Collectors.groupingBy(PlanSaveReqVO.Item::getGoodsId));
for (Map.Entry<Long, List<PlanSaveReqVO.Item>> entry : groupedItems.entrySet()) {
List<PlanSaveReqVO.Item> items = entry.getValue();
// 创建计划
PlanDO plan = BeanUtils.toBean(createReqVO, PlanDO.class);
plan.setId(identifierGenerator.nextId(plan).longValue());
plan.setSort(0L);
String orderNos = items.stream().map(PlanSaveReqVO.Item::getOrderId).distinct().toList().toString();
plan.setOrderNos(orderNos);
plan.setProduceTime(null);
planDOS.add(plan);
goodsPlanId.put(entry.getKey(), plan.getId());
Set<Long> itemIds = plateMapper.selectBatchOrderIdsAndGoodsIds(items,getUserOrganId());
if (CollectionUtil.isNotEmpty(itemIds)) {
for (Long itemId : itemIds) {
planItemDOS.add(PlanItemDO.builder()
.planId(plan.getId())
.itemId(itemId)
.build());
}
if(size1 == list.get(0)){
OrderDO orderDO = orderMapper.selectById(orderId).setStatus(OrderStatusEnum.IN_PRODUCTION.getStatus());
orderMapper.updateById(orderDO);
}
}
Long planId = plan.getId();
planMapper.insertBatch(planDOS);
Set<Long> itemIds = plateMapper.selectBatchOrderIdsAndGoodsIds(itemList,getUserOrganId());
planItemMapper.insertBatch(planItemDOS);
if (CollectionUtil.isNotEmpty(itemIds)) {
ArrayList<PlanItemDO> planItemDOS = new ArrayList<>();
for (Long itemId : itemIds) {
planItemDOS.add(PlanItemDO.builder()
.planId(planId)
.itemId(itemId)
.build());
}
planItemMapper.insertBatch(planItemDOS);
}
// 返回
return plan.getId();
return goodsPlanId;
//
// // 插入
// PlanDO plan = BeanUtils.toBean(createReqVO, PlanDO.class);
// plan.setSort(0L);
// String orderNos = itemList.stream().map(PlanSaveReqVO.Item::getOrderId).distinct().toList().toString();
// plan.setOrderNos(orderNos);
// plan.setProduceTime(null);
// planMapper.insert(plan);
//
// // 修改对应的生产单的状态为 已排单
// List<Long> orderIds = itemList.stream().map(PlanSaveReqVO.Item::getOrderId).toList();
//
// List<OrderDO> orderDOS = orderMapper.selectBatchIds(orderIds);
//
// List<OrderDO> orderDOList = orderDOS.stream().map(o -> o.setStatus(OrderStatusEnum.SORTED.getStatus())).toList();
//
// orderMapper.updateBatch(orderDOList);
//
// Long planId = plan.getId();
//
//
// // 返回
// return plan.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updatePlan(PlanSaveReqVO updateReqVO) {
// 校验存在
validatePlanExists(updateReqVO.getId());
validatePlanExists(updateReqVO.getId(),updateReqVO.getMachineId());
// 更新
PlanDO plan = BeanUtils.toBean(updateReqVO, PlanDO.class);
// 目前只解决非混单的情况
if(!updateReqVO.getItemList().isEmpty()){
List<OptimizeBoardModelDO> optimizeBoardModelDOS = buildBoardByPlanId(plan.getId(), ORDER_REMAIN_PLATE_MODEL, 99);
OptimizeBoardModelDO optimizeBoardModelDO = optimizeBoardModelDOS.get(0);
List<Long> goodsNo = optimizeBoardModelDO.getCutedBoardInfo().getCutedBoardList();
List<Long> plateNo = new ArrayList<>();
// 创建一个列表存储 BlockPlaceInfo 对象,将优化的小板信息拿出,获取到小板编号,查询生产单,修改生产单的状态
List<BlockPlaceInfo> outputList = new ArrayList<>();
ObjectMapper mapper = new ObjectMapper();
try {
// 解析 JSON 字符串
JsonNode jsonArray = mapper.readTree(optimizeBoardModelDO.getBlockPlaceInfo());
// 遍历 JSON 数组并提取所需字段
if (jsonArray.isArray()) {
for (JsonNode jsonNode : jsonArray) {
Long bi = jsonNode.get("bi").asLong();
Long bo = jsonNode.get("bo").asLong();
outputList.add(new BlockPlaceInfo(bi,bo));
}
}
} catch (JsonProcessingException e) {
e.printStackTrace();
}
for (Long goods : goodsNo) {
plateNo.addAll(outputList.stream().filter(f -> f.getBi().equals(goods)).map(BlockPlaceInfo::getBo).distinct().toList());
}
if(updateReqVO.getDeleteIds() != null) {
List<PlateDO> plateDOS = plateMapper.selectPlateListByGoodsIds(updateReqVO.getDeleteIds(), getUserOrganId());
List<Long> deletePlateNos = plateDOS.stream().map(PlateDO::getPlateNo).map(Long::valueOf).toList();
List<Long> plateNoCopyList = new ArrayList<>(plateNo);
// 使用retainAll方法保留 plateNo 中与 deletePlateNos 相同的元素
plateNoCopyList.retainAll(deletePlateNos);
// 如果 plateNoCopyList 不为空,说明两个List有共同的元素
boolean b = !plateNoCopyList.isEmpty();
if (b) {
throw exception(THE_BOARD_HAS_BEEN_CUT_INTO_PIECES);
}
}
}
planMapper.updateById(plan);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deletePlan(Long id) {
public Boolean deletePlan(List<Long> ids) {
// 校验存在
PlanDO planDO = planMapper.selectById(id);
if (planDO == null) {
throw exception(PLAN_NOT_EXISTS);
}
if (planDO.getStatus().equals(PlanStatusEnum.DURINGCUTTING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENEDMATERIAL.getStatus())) {
throw exception(PLAN_NOT_ALLOW_DELETE);
}
// 删除
planMapper.deleteById(id);
/*planOrderMapper.delete(new LambdaQueryWrapperX<PlanOrderDO>().eq(PlanOrderDO::getPlanId, id));*/
planItemMapper.delete(new LambdaQueryWrapperX<PlanItemDO>().eq(PlanItemDO::getPlanId, id));
validatePlan(ids);
// 修改生产单的状态为待排单
List<Long> orderIds = JSON.parseArray(planDO.getOrderNos()).toJavaList(Long.class);
List<OrderDO> orderDOS = orderMapper.selectBatchIds(orderIds).stream().map(m -> m.setStatus(OrderStatusEnum.SORTED.getStatus())).collect(Collectors.toList());
orderMapper.updateBatch(orderDOS);
List<PlanDO> planDOS = planMapper.selectBatchIds(ids);
List<Long> orderIds = new ArrayList<>();
for (PlanDO planDO : planDOS) {
orderIds.addAll(JSON.parseArray(planDO.getOrderNos()).toJavaList(Long.class));
}
// 删除排单信息,排单明细表信息,ES优化数据
planMapper.deleteBatchIds(ids);
planItemMapper.delete(new LambdaQueryWrapperX<PlanItemDO>().in(PlanItemDO::getPlanId, ids));
// 排单对应的自增板的删除 todo 目前值解决了非混单的情况
List<OptimizeBoardModelDO> boardModelDOS = buildBoardByPlanIds(ids, ORDER_REMAIN_PLATE_MODEL, ids.size());
if(!boardModelDOS.isEmpty()) {
List<Long> goodsIds = boardModelDOS.stream().map(OptimizeBoardModelDO::getGoodsId).toList();
List<Long> goodsIdList = goodsMapper.selectListByGoodsIdList(goodsIds, orderIds, getUserOrganId()).stream().map(GoodsDO::getId).toList();
List<PlateDO> plateDOS = plateMapper.selectPlateIdList(goodsIdList, getUserOrganId());
if(!plateDOS.isEmpty()) {
List<Long> plateIds = plateDOS.stream().map(PlateDO::getId).toList();
plateMapper.deleteBatchIds(plateIds);
orderItemMapper.delete(new LambdaQueryWrapperX<OrderItemDO>().in(OrderItemDO::getPlateId, plateIds));
}
// 目前生产单的状态已经去除待排单,所以无需修改生产单的状态
// List<OrderDO> orderDOS = orderMapper.selectBatchIds(orderIds).stream().map(m -> m.setStatus(OrderStatusEnum.SORTED.getStatus())).collect(Collectors.toList());
// orderMapper.updateBatch(orderDOS);
// 删除排单对应的优化生产数据
deleteByPlanId(ids, ORDER_REMAIN_PLATE_MODEL);
}
List<Long> orderIdList = new ArrayList<>();
List<Long> diff;
// 根据生产单ID查询ES的优化数据
List<OptimizeBoardModelDO> optimizeBoardModelDOS = optimizePlanService.buildBoardByOrderIds(orderIds, ORDER_REMAIN_PLATE_MODEL, 999);
if(optimizeBoardModelDOS.isEmpty()){
diff = new ArrayList<>(orderIds);
}else {
optimizeBoardModelDOS.forEach(f -> orderIdList.addAll(f.getOrderId()));
// 已经删除的排单的生产单号和新查找的生生产单号对比,找出不同的部分
diff = orderIds.stream().filter(f -> !orderIdList.contains(f)).toList();
}
if(!diff.isEmpty()){
List<OrderDO> orderList = orderMapper.selectBatchIds(diff);
List<OrderDO> orderDOList = orderList.stream().map(m -> m.setStatus(OrderStatusEnum.NEW_ORDER.getStatus())).toList();
orderMapper.updateBatch(orderDOList);
}
return Boolean.TRUE;
}
private void validatePlanExists(Long id) {
if (planMapper.selectById(id) == null) {
private void validatePlanExists(Long id,Long machineId) {
PlanDO planDO = planMapper.selectById(id);
if ( planDO== null) {
throw exception(PLAN_NOT_EXISTS);
}
if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) && planDO.getMachineId().equals(machineId)){
throw exception(LIST_CHANGES_ARE_PROHIBITED);
}
}
private void validatePlan(List<Long> ids) {
planMapper.selectPlanByOrderIds(ids);
List<PlanDO> planDOS = planMapper.selectBatchIds(ids);
for (PlanDO planDO : planDOS) {
if ( planDO== null) {
throw exception(PLAN_NOT_EXISTS);
}
if ( planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus()) ) {
throw exception(PLAN_NOT_ALLOW_DELETE,planDO.getId());
}
}
}
@@ -232,21 +418,76 @@ public class PlanServiceImpl implements PlanService {
return respVO;
}
@Override
public PageResult<PlanRespVO> getPlanPage(PlanPageReqVO pageReqVO) {
PageResult<PlanDO> planDOPageResult = planMapper.selectPage(pageReqVO);
if (CollectionUtil.isEmpty(planDOPageResult.getList())) {
return new PageResult<>();
}
Set<Long> macheineIds = planDOPageResult.getList().stream().map(PlanDO::getMachineId).collect(Collectors.toSet());
List<CuttingRespDTO> machines = machineApi.list(macheineIds).getCheckedData();
PageResult<PlanDO> planDOPageResult = new PageResult<>();
if(pageReqVO.getIsUp() != null) {
PlanDO planDO = planMapper.selectById(pageReqVO.getId());
List<PlanDO> plan = pageReqVO.getIsUp() ?
planMapper.selectPlanIds(planDO.getUpdateTime().toString(),planDO.getSort(), getUserOrganId(), planDO.getId()) :
planMapper.selectPlanIdsFalse(planDO.getUpdateTime().toString(),planDO.getSort(), getUserOrganId(), planDO.getId());
if (plan.isEmpty()) {
throw exception(NO_PRODUCTION_ORDER_INFORMATION_AVAILABLE, pageReqVO.getIsUp() ? "" : "最后");
}
planDOPageResult.setList(plan);
}else {
planDOPageResult = planMapper.selectPage(pageReqVO);
if (CollectionUtil.isEmpty(planDOPageResult.getList())) {
return new PageResult<>();
}
}
Set<Long> machineIds = planDOPageResult.getList().stream().map(PlanDO::getMachineId).collect(Collectors.toSet());
List<Long> planIds = planDOPageResult.getList().stream().map(PlanDO::getId).collect(Collectors.toList());
List<CuttingRespDTO> machines = machineApi.list(machineIds).getCheckedData();
List<PlateInfoVO> plateInfoVOS = planItemMapper.selectGoodsList(planIds,getUserOrganId());
List<OrderIds> orderIdsList = new ArrayList<>();
plateInfoVOS.forEach(f->
orderIdsList.addAll(f.getOrderIdList()));
List<PlateInfoVO> plateInfoVOList = plateMapper.selectPlateArea(orderIdsList, getUserOrganId());
// todo 目前这种情况只解决没有混单的情况,混单情况待解决 (目前解决,数据正确性待测试)
for (PlateInfoVO plateInfoVO : plateInfoVOS) {
plateInfoVO.setArea(plateInfoVOList.stream()
.filter(s->s.getGoodsId().equals(plateInfoVO.getGoodsId()))
.map(PlateInfoVO::getArea)
.reduce(BigDecimal.ZERO,BigDecimal::add));
// plateInfoVO.setOptimizeGoodsCount(plateInfoVOList.stream().filter(s->s.getGoodsId().equals(plateInfoVO.getGoodsId())).mapToLong(PlateInfoVO::getOptimizeGoodsCount).sum());
}
// 根据排单ID查询ES中的优化数据 todo 目前只解决无混单的情况,混单情况待解决
List<OptimizeBoardModelDO> optimizeBoardModelDOS = buildBoardByPlanIds(planIds, ORDER_REMAIN_PLATE_MODEL, plateInfoVOS.size());
// 获取排单对应的生产单的信息
List<PlanOrderRespVO> planOrderRespVOS = planItemMapper.selectOrderList(planIds, getUserOrganId());
@@ -256,14 +497,40 @@ public class PlanServiceImpl implements PlanService {
planRespVOPageResult.getList().forEach(e -> {
// 机台信息
e.setMachineName(machines.stream()
.filter(f -> Objects.equals(f.getId(), e.getMachineId()))
.map(CuttingRespDTO::getName)
.findAny()
.orElse(null));
// 板材信息列表
e.setPlateInfoList(plateInfoVOS.stream()
.filter(f -> Objects.equals(f.getPlanId(), e.getId()))
.collect(Collectors.toList()));
// todo 小板总数量目前只解决没有混单的情况时的小板数量,后续待加入混单情况 (目前解决,数据正确性待测试)
e.setPlateNum(plateInfoVOS.stream()
.filter(f -> Objects.equals(f.getPlanId(), e.getId()))
.mapToLong(PlateInfoVO::getCount)
.sum());
// todo 大板优化数量目前只解决没有混单的情况时的小板数量,后续待加入混单情况 (目前解决,数据正确性待测试)
e.setOptimizeGoodsCount(optimizeBoardModelDOS.stream()
.filter(f -> Objects.equals(f.getPlanId(), e.getId()))
// todo 目前兼容修改,新的需求不需要这个校验
.mapToLong(m -> m.getBoardCount() == null ?0 : m.getBoardCount())
.sum());
// 大板开料数
e.setCutGoodsCount(optimizeBoardModelDOS.stream()
.filter(f->Objects.equals(f.getPlanId(), e.getId()))
.mapToLong(m-> m.getCutedBoardInfo() == null ? 0 : m.getCutedBoardInfo().getCutedBoardNumber())
.sum());
// 小板优化数量
e.setOptimizePlateCount(optimizeBoardModelDOS.stream()
.filter(f->Objects.equals(f.getPlanId(), e.getId()))
.mapToLong(m-> m.getPlaceBlockNumber() == null ? 0 : m.getPlaceBlockNumber())
.sum());
// 未优化小板数量
e.setUnOptimizePlateCount(e.getPlateNum() - e.getOptimizePlateCount());
// 生产单信息
e.setOrderList(planOrderRespVOS.stream()
.filter( f-> Objects.equals(f.getPlanId(), e.getId()))
.collect(Collectors.toList()));
@@ -276,25 +543,72 @@ public class PlanServiceImpl implements PlanService {
public PageResult<OrderRespVOCopy> getOrderPage(OrderPageReqVOCopy pageReqVO) {
PageDTO<OrderRespVOCopy> page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
List<Integer> statusList = new ArrayList<>();
statusList.add(OrderStatusEnum.NEW_ORDER.getStatus());
statusList.add(OrderStatusEnum.IN_PRODUCTION.getStatus());
statusList.add(OrderStatusEnum.SORTED.getStatus());
// todo 修改排单数据筛选,目前只解决了非混单的情况,混单情况待解决
List<GoodsDO> goodsDOS = goodsMapper.selectListByGoodsId(pageReqVO.getGoodsId(), getUserOrganId());
// List<Long> orderIds = new ArrayList<>();
// if(pageReqVO.getGoodsId() != null) {
// List<GoodsDO> goodsDOS = goodsMapper.selectListByGoodsId(pageReqVO.getGoodsId(), getUserOrganId());
// orderIds = goodsDOS.stream().map(GoodsDO::getOrderId).toList();
// }
QueryWrapperX<OrderDO> queryWrapperX = new QueryWrapperX<>();
queryWrapperX
.eq("a.organ_id",getUserOrganId())
.eq("a.status",OrderStatusEnum.SORTED.getStatus())
// .eq("a.status",OrderStatusEnum.SORTED.getStatus())
.eq("a.deleted",false)
.in("a.status",statusList)
.isNull("opi.item_id")
// todo 修改排单数据筛选,目前只解决了非混单的情况,混单情况待解决
.inIfPresent("op.goods_id",goodsDOS.isEmpty() ? null :goodsDOS.stream().map(GoodsDO::getId).toList())
.inIfPresent("a.id",pageReqVO.getOrderIds())
.likeIfPresent("a.id", pageReqVO.getOrderId() != null ? pageReqVO.getOrderId().toString() : null)
// .isNull("opi.item_id")
.inIfPresent("op.goods_id",pageReqVO.getIds())
.eqIfPresent("a.customer", pageReqVO.getConsignee())
.eqIfPresent("a.custom_order_no", pageReqVO.getDefaultId())
.eqIfPresent("a.address", pageReqVO.getConsigneeAddress())
.betweenIfPresent("a.create_time", pageReqVO.getCreateTime())
.eqIfPresent("op.is_special_shaped", pageReqVO.getRectangle() != null ? false: null)
.eqIfPresent("op.is_special_shaped", pageReqVO.getSpecialShaped())
.eqIfPresent("op.is_sculpt", pageReqVO.getSculpt())
.eqIfPresent("op.is_door", pageReqVO.getIsDoor())
.betweenIfPresent("op.height", new BigDecimal[]{pageReqVO.getLongMinRang(), pageReqVO.getLongMaxRang()})
.betweenIfPresent("op.width", new BigDecimal[]{pageReqVO.getWidthMinRang(), pageReqVO.getWidthMaxRang()})
.groupBy("a.id", " a.order_date", "a.delivery_date", "a.customer", "a.address", "a.custom_order_no","a.create_time","a.update_time")
.orderByDesc("a.update_time");
.groupBy("a.id", " a.order_date", "a.delivery_date", "a.customer", "a.address", "a.custom_order_no","a.create_time","a.update_time","a.status")
.having("count(op.id) != 0")
.orderByDesc("a.create_time");
IPage<OrderRespVOCopy> orderRespVOCopies = orderMapper.selectOrderPage(page, queryWrapperX);
if (CollectionUtil.isEmpty(orderRespVOCopies.getRecords())) {
return new PageResult<>();
}
return new PageResult<>(orderRespVOCopies.getRecords(), orderRespVOCopies.getTotal());
}
@Override
public List<NotPlanOrderPlateRespVO> getOrderPlateList(OrderPageReqVOCopy pageReqVO) {
QueryWrapperX<PlateDO> queryWrapperX = new QueryWrapperX<>();
queryWrapperX
.eq("c.organ_id",getUserOrganId())
.inIfPresent("c.order_id", pageReqVO.getOrderIds())
.isNull("opi.item_id")
.inIfPresent("oi.room_id",pageReqVO.getRoomId())
.inIfPresent("oi.body_id",pageReqVO.getBodyId())
.eqIfPresent("a.is_special_shaped", pageReqVO.getRectangle() != null ? false: null)
.eqIfPresent("a.is_special_shaped", pageReqVO.getSpecialShaped())
.eqIfPresent("a.is_sculpt", pageReqVO.getSculpt())
.eqIfPresent("a.is_door", pageReqVO.getIsDoor())
.betweenIfPresent("a.height", new BigDecimal[]{pageReqVO.getLongMinRang(), pageReqVO.getLongMaxRang()})
.betweenIfPresent("a.width", new BigDecimal[]{pageReqVO.getWidthMinRang(), pageReqVO.getWidthMaxRang()})
.groupBy("c.id", " c.order_id", "c.goods_name", "c.width", "c.height", "c.thickness","c.material","c.color","c.texture","c.goods_id");
String filterTypes = "";
if (Objects.nonNull(pageReqVO.getHoleThrough()) && pageReqVO.getHoleThrough()) {
filterTypes += PlanFilterTypeEnum.DIGGINGTHROUGHTHESHAPE.getType().toString();
@@ -306,46 +620,89 @@ public class PlanServiceImpl implements PlanService {
filterTypes += PlanFilterTypeEnum.TWODIMENSIONALCUTTINGPATH.getType().toString();
}
queryWrapperX.likeIfPresent("op.filter_type", insertSeparator(filterTypes));
queryWrapperX.likeIfPresent("a.filter_type", insertSeparator(filterTypes));
IPage<OrderRespVOCopy> orderRespVOCopies = orderMapper.selectOrderPage(page, queryWrapperX);
// List<NotPlanOrderPlateRespVO> platePages = plateMapper.selectGoodsPage(pageReqVO.getOrderIds(),getUserOrganId()/*, orderRespVOCopy.getGoodsId()*/);
if (CollectionUtil.isEmpty(orderRespVOCopies.getRecords())) {
return new PageResult<>();
List<NotPlanOrderPlateRespVO> notPlanOrderPlateRespVOS = plateMapper.selectGoodsPage(queryWrapperX);
// todo 目前数据筛选只考虑了非混单的情况,混单情况待解决
if(pageReqVO.getGoodsId() != null) {
return notPlanOrderPlateRespVOS.stream().filter(f -> f.getGoodsId().equals(pageReqVO.getGoodsId())).toList();
}
List<OrderRespVOCopy> records = orderRespVOCopies.getRecords();
List<Long> orderIds = records.stream().map(m -> m.getOrderId()).collect(Collectors.toList());
List<PlatePage> platePages = plateMapper.selectGoodsPage(orderIds,getUserOrganId()/*, orderRespVOCopy.getGoodsId()*/);
return notPlanOrderPlateRespVOS;
List<OrderRespVOCopy> filteredRecords = records.stream()
.filter(record -> {
List<PlatePage> filteredPages = platePages.stream()
.filter(f -> Objects.equals(f.getOrderId(), record.getOrderId()))
.collect(Collectors.toList());
if (filteredPages.isEmpty()) {
return false; // 移除该记录
} else {
record.setPlatePages(filteredPages);
return true; // 保留该记录
}
})
.collect(Collectors.toList());
// 处理后的 filteredRecords 将不包含过滤后的数据为空的 record
orderRespVOCopies.setRecords(filteredRecords);
// orderRespVOCopies.setTotal(orderRespVOCopies.getRecords().size());
// List<OrderRespVOCopy> filteredRecords = records.stream()
// .filter(record -> {
// List<PlatePage> filteredPages = platePages.stream()
// .filter(f -> Objects.equals(f.getOrderId(), record.getOrderId()))
// .collect(Collectors.toList());
// if (filteredPages.isEmpty()) {
// return false; // 移除该记录
// } else {
// record.setPlatePages(filteredPages);
// return true; // 保留该记录
// }
// })
// .collect(Collectors.toList());
//
// // 处理后的 filteredRecords 将不包含过滤后的数据为空的 record
// orderRespVOCopies.setRecords(filteredRecords);
//
//// orderRespVOCopies.setTotal(orderRespVOCopies.getRecords().size());
//
//
// return new PageResult<>(orderRespVOCopies.getRecords(), orderRespVOCopies.getTotal());
return new PageResult<>(orderRespVOCopies.getRecords(), orderRespVOCopies.getTotal());
}
@Override
public List<NotPlanGoodsRespVO> getNotOptimizeGoodsList(NotPlanGoodsReqVO reqVO) {
// 板材库对应的大板ID
List<Long> plateGoodIds = reqVO.getOrderIdList().stream().map(OrderIds::getId).toList();
List<NotPlanGoodsRespVO> notPlanGoodsRespVOS = goodsMapper.selectJoinList(NotPlanGoodsRespVO.class, new MPJLambdaWrapperX<GoodsDO>()
.leftJoin(PlateDO.class, PlateDO::getGoodsId, GoodsDO::getId)
.selectCount(PlateDO::getId,"plateNum")
.select(GoodsDO::getGoodsId, GoodsDO::getHeight, GoodsDO::getWidth, GoodsDO::getColor, GoodsDO::getGoodsName, GoodsDO::getThickness,GoodsDO::getSpec,GoodsDO::getMaterial,GoodsDO::getTexture)
.isNotNull(PlanItemDO::getId)
.eq(GoodsDO::getOrganId, getUserOrganId())
.in(GoodsDO::getId, plateGoodIds)
.groupBy(GoodsDO::getGoodsId, GoodsDO::getHeight, GoodsDO::getWidth, GoodsDO::getColor, GoodsDO::getGoodsName, GoodsDO::getThickness,GoodsDO::getSpec,GoodsDO::getMaterial,GoodsDO::getTexture));
// // 生产单对应的大板ID
// List<Long> goodIds = reqVO.getOrderIdList().stream().map(OrderIds::getId).toList();
//
// // 查询板材库的大板信息
// List<NotPlanGoodsRespVO> notPlanGoodsRespVOS = goodsMapper.selectGoodsPlateList(plateGoodIds, getUserOrganId());
// 查询小板数量
// List<PlateDO> plateDOS = plateMapper.selectGoodsPlateNum(goodIds, getUserOrganId());
// List<NotPlanGoodsRespVO> notPlanGoodsRespVOS = BeanUtils.toBean(goodsDOS, NotPlanGoodsRespVO.class);
for (NotPlanGoodsRespVO notPlanGoodsRespVO : notPlanGoodsRespVOS) {
notPlanGoodsRespVO.setOrderIdList(reqVO.getOrderIdList()
.stream()
.filter(orderIds -> orderIds.getGoodsId().equals(notPlanGoodsRespVO.getGoodsId())).toList());
notPlanGoodsRespVO.setGoodsNum(notPlanGoodsRespVO.getOrderIdList().stream().map(OrderIds::getId).toList().size());
}
return notPlanGoodsRespVOS;
}
@@ -356,17 +713,24 @@ public class PlanServiceImpl implements PlanService {
PageDTO<OrderGoodsResp> page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
List<Integer> statusList = new ArrayList<>();
statusList.add(OrderStatusEnum.NEW_ORDER.getStatus());
statusList.add(OrderStatusEnum.IN_PRODUCTION.getStatus());
statusList.add(OrderStatusEnum.SORTED.getStatus());
List<Long> orderIds = orderMapper.selectOrderIdsList(pageReqVO, statusList, getUserOrganId())
.stream().map(OrderDO::getId).toList();
QueryWrapperX<OrderDO> queryWrapperX = new QueryWrapperX<>();
queryWrapperX
.eq("a.organ_id",getUserOrganId())
.eq("a.status",OrderStatusEnum.SORTED.getStatus())
.eq("a.deleted",false)
.likeIfPresent("a.id", pageReqVO.getOrderId() != null ? pageReqVO.getOrderId().toString() : null)
// .isNull("opi.item_id")
.eqIfPresent("a.customer", pageReqVO.getConsignee())
.eqIfPresent("a.custom_order_no", pageReqVO.getDefaultId())
.eqIfPresent("a.address", pageReqVO.getConsigneeAddress())
.betweenIfPresent("a.create_time", pageReqVO.getCreateTime())
.eq("oi.organ_id",getUserOrganId())
.eq("og.deleted",false)
.inIfPresent("oi.order_id", orderIds)
.isNull("opi.item_id")
.isNotNull("og.id")
// todo 修改排单数据筛选,目前只解决了非混单的情况,混单情况待解决
.eqIfPresent("og.goods_id",pageReqVO.getGoodsId())
.eqIfPresent("op.is_special_shaped", pageReqVO.getRectangle() != null ? false: null)
.eqIfPresent("op.is_special_shaped", pageReqVO.getSpecialShaped())
.eqIfPresent("op.is_sculpt", pageReqVO.getSculpt())
@@ -387,36 +751,45 @@ public class PlanServiceImpl implements PlanService {
queryWrapperX.likeIfPresent("op.filter_type", insertSeparator(filterTypes));
List<Long> orderIds = orderMapper.selectOrderIds(queryWrapperX);
if(orderIds.isEmpty()){
return new PageResult<>();
}
// List<Long> orderIds = orderMapper.selectOrderIds(queryWrapperX);
List<OrderIds> orderIdsList = plateMapper.selectOrderIds(orderIds,getUserOrganId());
IPage<OrderGoodsResp> orderGoodsResps = orderMapper.selectOrderIds(page,queryWrapperX);
// if(orderIds.isEmpty()){
// return new PageResult<>();
// }
//
//
// List<OrderIds> orderIdsList = plateMapper.selectOrderIds(orderIds,getUserOrganId());
//
//
// List<Long> goodsList = orderIdsList.stream().map(OrderIds::getGoodsId).distinct().toList();
//
// // 修改排单时进行数据筛选,todo 目前只解决非混单情况
// if(pageReqVO.getGoodsId() != null){
//
// goodsList = goodsList.stream().filter(f->f.equals(pageReqVO.getGoodsId())).toList();
//
// }
//
// IPage<OrderGoodsResp> orderGoodsResps = goodsMapper.selectGoods(page,goodsList, getUserOrganId());
List<Long> goodsList = orderIdsList.stream().map(OrderIds::getGoodsId).distinct().toList();
// List<OrderRespVOCopy> orderRespVOCopies = orderMapper.selectOrderListByIds(orderIdsList, getUserOrganId());
IPage<OrderGoodsResp> orderGoodsResps = goodsMapper.selectGoods(page,goodsList, getUserOrganId());
List<OrderRespVOCopy> orderRespVOCopies = orderMapper.selectOrderListByIds(orderIdsList, getUserOrganId());
for (OrderGoodsResp record : orderGoodsResps.getRecords()) {
record.setNum(orderRespVOCopies.stream().filter(e-> Objects.equals(e.getGoodsId(), record.getGoodsId())).
mapToInt(OrderRespVOCopy::getNum).sum());
record.setArea(orderRespVOCopies.stream().filter(e-> Objects.equals(e.getGoodsId(), record.getGoodsId()))
.map(OrderRespVOCopy::getArea)
.reduce(BigDecimal.ZERO,BigDecimal::add));
record.setOrderIds(orderIdsList.stream().filter(e -> Objects.equals(e.getGoodsId(), record.getGoodsId())).collect(Collectors.toList()));
record.setOrderList(orderRespVOCopies.stream().filter(e -> Objects.equals(e.getGoodsId(), record.getGoodsId())).collect(Collectors.toList()));
}
// for (OrderGoodsResp record : orderGoodsResps.getRecords()) {
// record.setNum(orderRespVOCopies.stream().filter(e-> Objects.equals(e.getGoodsId(), record.getGoodsId())).
// mapToInt(OrderRespVOCopy::getNum).sum());
//
// record.setArea(orderRespVOCopies.stream().filter(e-> Objects.equals(e.getGoodsId(), record.getGoodsId()))
// .map(OrderRespVOCopy::getArea)
// .reduce(BigDecimal.ZERO,BigDecimal::add));
//
// record.setOrderIds(orderIdsList.stream().filter(e -> Objects.equals(e.getGoodsId(), record.getGoodsId())).collect(Collectors.toList()));
//// record.setOrderList(orderRespVOCopies.stream().filter(e -> Objects.equals(e.getGoodsId(), record.getGoodsId())).collect(Collectors.toList()));
// }
return new PageResult<>(orderGoodsResps.getRecords(), orderGoodsResps.getTotal());
@@ -466,9 +839,9 @@ public class PlanServiceImpl implements PlanService {
if (planDO == null) {
throw exception(PLAN_NOT_EXISTS);
}
if (planDO.getStatus().equals(PlanStatusEnum.NEWORDER.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.BOARDHASBEENAPPLIEDFOR.getStatus())) {
throw exception(PLAN_NOT_ALLOW_CANCEL);
}
// if (planDO.getStatus().equals(PlanStatusEnum.NEWORDER.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.BOARDHASBEENAPPLIEDFOR.getStatus())) {
// throw exception(PLAN_NOT_ALLOW_CANCEL);
// }
Set<Long> itemIds = planItemMapper.selectList(new LambdaQueryWrapperX<PlanItemDO>()
.eq(PlanItemDO::getOrganId,getUserOrganId())
.eq(PlanItemDO::getPlanId, id))
@@ -484,7 +857,7 @@ public class PlanServiceImpl implements PlanService {
return null;
}
for (Long planId : vo.getPlanIds()) {
validatePlanExists(planId);
validatePlanExists(planId,null);
}
QueryWrapperX<PlateDO> queryWrapperX = new QueryWrapperX<>();
@@ -589,5 +962,74 @@ public class PlanServiceImpl implements PlanService {
}
@Override
public List<OrderRoomBodyList> getOrderRoomBody(List<Long> orderIds) {
List<OrderRoomBodyList> orderRoomBodyLists = orderItemMapper.selectRoomBodyByOrderId(orderIds, getUserOrganId());
return orderRoomBodyLists;
}
public void deleteByPlanId(List<Long> planIds, String index) {
List<FieldValue> fieldValues = planIds.stream().map(FieldValue::of).toList();
DeleteByQueryRequest.Builder builder = new DeleteByQueryRequest.Builder();
builder.index(index);
builder.query(q -> q.terms(b -> b.field("planId").terms(e -> e.value(fieldValues))));
try {
DeleteByQueryResponse response = elasticsearchClient.deleteByQuery(builder.build());
log.info("Deleted {} documents with planId {}", response.deleted(), planIds);
} catch (IOException e) {
log.error("Error deleting documents with planId {}: {}", planIds, e.getMessage());
throw new ServiceException(ES_ERROR_DELETE);
}
}
public List<OptimizeBoardModelDO> buildBoardByPlanIds(Collection<Long> planIds, String index, Integer size) {
List<FieldValue> fieldValues = planIds.stream().map(FieldValue::of).toList();
SearchRequest.Builder builder = new SearchRequest.Builder();
builder.index(index);
builder.size(size);
builder.query(q -> q.terms(b -> b.field("planId").terms(e -> e.value(fieldValues))));
try {
SearchResponse<OptimizeBoardModelDO> search = elasticsearchClient.search(builder.build(), OptimizeBoardModelDO.class);
List<Hit<OptimizeBoardModelDO>> hits = search.hits().hits();
if (CollectionUtil.isNotEmpty(hits)) {
return hits.stream().map(Hit::source).collect(Collectors.toList());
}
return new ArrayList<>();
} catch (IOException e) {
log.error(e.getMessage());
throw new ServiceException(INTERNAL_SERVER_ERROR);
}
}
private List<OptimizeBoardModelDO> buildBoardByPlanId(Long planId, String index,Integer size) {
SearchRequest.Builder builder = new SearchRequest.Builder();
builder.index(index);
builder.size(size);
builder.query(q -> q.term(b -> b.field("planId").value(planId)));
try {
SearchResponse<OptimizeBoardModelDO> search = elasticsearchClient.search(builder.build(), OptimizeBoardModelDO.class);
List<Hit<OptimizeBoardModelDO>> hits = search.hits().hits();
if (CollectionUtil.isNotEmpty(hits)) {
return hits.stream().map(Hit::source).collect(Collectors.toList());
}
return new ArrayList<>();
} catch (IOException e) {
log.error(e.getMessage());
throw new ServiceException(INTERNAL_SERVER_ERROR);
}
}
}
@@ -1,6 +1,5 @@
package com.cf.imes.module.executor.service.plate;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
@@ -13,57 +12,44 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil;
import com.cf.imes.framework.common.util.json.JsonUtils;
import com.cf.imes.framework.es.core.service.ESDocumentService;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.cf.imes.framework.security.core.LoginUser;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsSaveReqVO;
import com.cf.imes.module.executor.controller.admin.plate.vo.*;
import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO;
import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO;
import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO;
import com.cf.imes.module.executor.dal.dataobject.planitem.PlanItemDO;
import com.cf.imes.module.executor.dal.dataobject.processStepItem.OrderProcessStepItemDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
import com.cf.imes.module.executor.dal.mysql.goods.GoodsMapper;
import com.cf.imes.module.executor.dal.mysql.orderBody.OrderBodyMapper;
import com.cf.imes.module.executor.dal.mysql.orderGroup.OrderGroupMapper;
import com.cf.imes.module.executor.dal.mysql.orderItem.OrderItemMapper;
import com.cf.imes.module.executor.dal.mysql.planitem.PlanItemMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.executor.dal.mysql.processStepItem.ProcessStepItemMapper;
import com.cf.imes.module.executor.enums.OrderItemType;
import com.cf.imes.module.executor.util.RandomUtils;
import com.cf.imes.module.executor.util.fileConversion.admin.SnowflakeIdWorker3rd;
import com.cf.imes.module.system.enums.ErrorCodeConstants;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.stream.Collectors;
import com.cf.imes.module.executor.controller.admin.plate.vo.*;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper;
import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR;
import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId;
import static com.cf.imes.module.executor.service.optimizeplan.OptimizePlanService.ORDER_PLATE_MODEL;
import static com.cf.imes.module.system.enums.ErrorCodeConstants.*;
import static com.cf.imes.module.system.enums.ErrorCodeConstants.PLATE_NOT_EXISTS;
import static com.cf.imes.module.system.enums.ErrorCodeConstants.THE_CURRENT_BOARD_IS_NOT_SELECTED;
/**
* 生产单板件 Service 实现类
@@ -267,6 +253,8 @@ public class PlateServiceImpl implements PlateService {
}
Long goodsId = goodsMapper.selectGoodsId(reqVO.getOrderId(), reqVO.getGoodsId(), getUserOrganId()).getId();
List<PlateDO> plateDOS = new ArrayList<>();
for (int i = 0; i < reqVO.getMultiple(); i++) {
@@ -279,7 +267,7 @@ public class PlateServiceImpl implements PlateService {
plateDO.setRemark(reqVO.getRemake1() +","+ reqVO.getRemake2());
plateDO.setHoleArrange(reqVO.getPlaceHole());
plateDO.setGoodsId(reqVO.getGoodsId());
plateDO.setGoodsId(goodsId);
plateDO.setPlateNo((obtainingTime) + Long.toString(plateNo).substring(2));
@@ -160,5 +160,7 @@ chenfeng:
send-maximum-quantity-per-day: 10
begin-code: 9999 # 这里配置 9999 的原因是,测试方便。
end-code: 9999 # 这里配置 9999 的原因是,测试方便。
encrypt:
enable: false
publicKey: cfimes
debug: false
@@ -32,9 +32,9 @@
orp.id as remainId
from order_goods og
left join order_remain_plate orp on og.id = orp.goods_id and og.organ_id = orp.organ_id
where og.organ_id =#{organId} and og.deleted = false and og.order_id in
where og.organ_id =#{organId} and og.deleted = false and og.id in
<foreach item="id" collection="orderIds" open="(" separator="," close=")">
<foreach item="id" collection="goodsIds" open="(" separator="," close=")">
#{id}
</foreach>
@@ -90,15 +90,48 @@
</select>
<select id="selectGoodsPlateList"
resultType="com.cf.imes.module.executor.controller.admin.plan.saveOptimize.NotPlanGoodsRespVO">
select distinct
og.goods_id,
og.height,
og.width,
og.color,
og.goods_name,
og.thickness,
og.spec,
count(distinct op.id) as plateNum
from order_goods og
left join order_plate op on og.id = op.goods_id and og.organ_id = op.organ_id
where og.organ_id = #{organId} and og.goods_id in
<foreach item="goodIds" collection="goodIds" open="(" separator="," close=")">
#{goodIds}
</foreach>
group by og.goods_id,og.height,og.width,og.color,og.goods_name,og.thickness,og.spec ;
</select>
<select id="seleTestSQL" resultType="java.util.Map">
select ${filed} from order_goods where organ_id = #{organId}
and deleted = false
and goods_id in
<foreach item="goodsIds" collection="goodsIds" open="(" separator="," close=")">
#{goodsIds}
</foreach>
</select>
</mapper>
@@ -3,29 +3,77 @@
<mapper namespace="com.cf.imes.module.executor.dal.mysql.order.OrderMapper">
<select id="selectOrderPage" resultType="com.cf.imes.module.executor.controller.admin.plan.vo.OrderRespVOCopy">
select distinct a.id as orderId, a.order_date, a.delivery_date, a.customer, a.address, a.custom_order_no as defineId,
count(op.id) as num, sum(op.area) as area,a.update_time
select distinct a.id as orderId, a.order_date, a.delivery_date, a.customer, a.address, a.custom_order_no as defineId,a.status,
count(op.id) as num, sum(op.area) as area,a.update_time,a.create_time
from `orders` a
left join order_item oi on a.id = oi.order_id and a.organ_id = oi.organ_id
inner join order_plate op on oi.plate_id = op.id and oi.organ_id = op.organ_id
left join order_plate op on oi.plate_id = op.id and oi.organ_id = op.organ_id
left join order_plan_item opi on oi.id = opi.item_id and oi.organ_id = opi.organ_id
${ew.customSqlSegment}
</select>
<select id="selectOrderIds" resultType="java.lang.Long">
<!-- <where>
a.deleted = false
and a.organ_id = #{organId}
and ( a.status = 3 or a.status = 2 or a.status = 1 )
and opi.item_id is null
<if test="pageReqVO.ids !=null">
and op.goods_id in
<foreach collection="pageReqVO.ids" item="pageReqVO.ids" open="(" close=")" separator=",">
#{pageReqVO.ids}
</foreach>
</if>
<if test="pageReqVO.orderId !=null">
and a.id like concat('%',#{pageReqVO.orderId},'%')
</if>
<if test="pageReqVO.consignee !=null">
and a.customer like concat('%',#{pageReqVO.consignee},'%')
</if>
<if test="pageReqVO.defaultId !=null">
and a.custom_order_no like concat('%',#{pageReqVO.defaultId},'%')
</if>
<if test="pageReqVO.consigneeAddress !=null">
and a.address like concat('%',#{pageReqVO.consigneeAddress},'%')
</if>
<if test="pageReqVO.createTime !=null">
between #{pageReqVO.createTime.[0]} and #{pageReqVO.createTime.[1]}
</if>
</where>
group by a.id, a.order_date, a.delivery_date, a.customer, a.address, a.custom_order_no,a.create_time,a.update_time,a.status
order by a.update_time desc ;-->
select distinct a.id
from `orders` a
left join order_item oi on a.id = oi.order_id and a.organ_id = oi.organ_id
inner join order_plate op on oi.plate_id = op.id and oi.organ_id = op.organ_id
${ew.customSqlSegment}
</select>
<!-- select distinct a.id
from `orders` a
left join order_item oi on a.id = oi.order_id and a.organ_id = oi.organ_id
inner join order_plate op on oi.plate_id = op.id and oi.organ_id = op.organ_id
${ew.customSqlSegment}-->
@@ -65,7 +113,6 @@
</foreach>
and o.organ_id = #{organId}
and op.deleted = false
and op.is_cancel = 0
and og.goods_id in
<foreach collection="orderIds" item="orderIds" open="(" close=")" separator=",">
@@ -166,4 +213,73 @@
ORDER BY
order_date;
</select>
<select id="selectTestSQL" resultType="java.util.Map">
select ${filed} from orders
where organ_id = #{organId}
and deleted = false
and id in
<foreach collection="orderIds" item="orderIds" open="(" close=")" separator=",">
#{orderIds}
</foreach>
</select>
<resultMap id="OrderGoodsMap" type="com.cf.imes.module.executor.controller.admin.plan.vo.OrderGoodsResp">
<result property="width" column="width"/>
<result property="height" column="height"/>
<result property="thickness" column="thickness"/>
<result property="goodsName" column="goods_name"/>
<result property="material" column="material"/>
<result property="color" column="color"/>
<result property="texture" column="texture"/>
<result property="brand" column="brand"/>
<result property="goodsId" column="goodsId"/>
<collection property="orderIds" ofType="com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds" resultMap="OrderIdMap"/>
</resultMap>
<resultMap id="OrderIdMap" type="com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds">
<result property="orderId" column="orderId"/>
<result property="id" column="id"/>
<result property="goodsId" column="goodsId"/>
</resultMap>
<select id="selectOrderIds" resultMap="OrderGoodsMap">
select distinct
og.order_id as orderId,
og.id as id,
og.goods_id as goodsId,
og.goods_name,
og.color,
og.material,
og.texture,
og.thickness,
og.width,
og.height,
og.brand
from order_item oi
left join order_plan_item opi on oi.id = opi.item_id and oi.organ_id = opi.organ_id
left join order_plate op on oi.plate_id = op.id and oi.organ_id = op.organ_id
left join order_goods og on op.goods_id = og.id and op.organ_id = og.organ_id
${ew.customSqlSegment}
</select>
</mapper>
@@ -3,8 +3,8 @@
<mapper namespace="com.cf.imes.module.executor.dal.mysql.order.OrderStatisticsMapper">
<select id="selectOrderSquareProduce" resultType="java.lang.Integer">
SELECT SUM(op.area) as area FROM orders o
LEFT JOIN order_plate op on op.order_id = o.id
WHERE o.deleted = 0
JOIN order_plate op on op.order_id = o.id
WHERE o.deleted = 0 and o.status = 3;
</select>
<sql id="dateFormat">
@@ -207,6 +207,55 @@
<resultMap id="RoomBodyListMap" type="com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomBodyList">
<result property="orderId" column="orderId"/>
<collection property="orderRoomIds" ofType="com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomIds" resultMap="OrderRoomIdsMap"/>
</resultMap>
<resultMap id="OrderRoomIdsMap" type="com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomIds">
<result property="roomId" column="roomId"/>
<result property="roomName" column="roomName"/>
<collection property="orderBodyIds" ofType="com.cf.imes.module.executor.controller.admin.plan.bo.OrderBodyIds" resultMap="OrderBodyIdsMap"/>
</resultMap>
<resultMap id="OrderBodyIdsMap" type="com.cf.imes.module.executor.controller.admin.plan.bo.OrderBodyIds">
<result property="bodyId" column="bodyId"/>
<result property="bodyName" column="bodyName"/>
</resultMap>
<select id="selectRoomBodyByOrderId"
resultMap="RoomBodyListMap"
parameterType="java.lang.Long">
select distinct
oi.order_id as orderId,
ob.id as bodyId,
ob.name as bodyName,
ob.room_id as roomId,
ob.room_name as roomName
from order_item oi
left join order_plan_item opi on oi.id = opi.item_id and oi.organ_id = opi.organ_id
left join order_body ob on oi.body_id = ob.id and oi.organ_id = ob.organ_id
where oi.organ_id = #{organId} and opi.item_id is null and oi.order_id in
<foreach item="orderIds" collection="orderIds" open="(" separator="," close=")">
#{orderIds}
</foreach>
</select>
</mapper>
@@ -121,4 +121,22 @@
WHERE order_id = #{orderId} AND organ_id = #{organId} AND deleted = #{deleted}
</select>
<select id="selectTestSql" resultType="com.cf.imes.module.executor.dal.dataobject.orderParts.OrderPartsDO">
select distinct ${filed} from order_parts where
organ_id = #{organId}
and deleted = false
and id in
<foreach item="partIds" collection="partIds" open="(" separator="," close=")">
#{partIds}
</foreach>
</select>
</mapper>
@@ -140,8 +140,7 @@
,CONCAT(YEAR(p.create_time), '-', MONTH(p.create_time), '-', DAY(p.create_time)) as date
</if>
from order_plan p
where p.organ_id = #{req.organId}
and p.create_time between #{req.createTime[0]} and #{req.createTime[1]}
where p.create_time between #{req.createTime[0]} and #{req.createTime[1]}
and p.deleted = 0
group by date;
</select>
@@ -162,12 +161,55 @@
,CONCAT(YEAR(p.create_time), '-', MONTH(p.create_time), '-', DAY(p.create_time)) as date
</if>
from order_plan p
join order_plan_item opi on p.id = opi.plan_id and opi.organ_id = #{req.organId}
join order_item oi on oi.id = opi.item_id and oi.organ_id = #{req.organId}
join order_plate op on oi.plate_id = op.id and op.organ_id = #{req.organId}
where p.organ_id = #{req.organId}
and p.create_time between #{req.createTime[0]} and #{req.createTime[1]}
join order_plan_item opi on p.id = opi.plan_id
join order_item oi on oi.id = opi.item_id
join order_plate op on oi.plate_id = op.id
where p.create_time between #{req.createTime[0]} and #{req.createTime[1]}
and p.deleted = 0
group by date;
</select>
<select id="seleTestSQL" resultType="java.util.Map">
select ${filed} from order_plan where id = #{planId} and organ_id = #{organId} and deleted = false
</select>
<select id="selectPlanIds" resultType="com.cf.imes.module.executor.dal.dataobject.plan.PlanDO">
select * from order_plan where
organ_id = #{organId}
and deleted = false
and update_time &gt;= #{updateTime}
and sort &lt;= #{sort}
and id != #{planId}
ORDER BY sort DESC, update_time
limit 1;
</select>
<select id="selectPlanIdsFalse" resultType="com.cf.imes.module.executor.dal.dataobject.plan.PlanDO">
select * from order_plan where
organ_id = #{organId}
and deleted = false
and update_time &lt;= #{updateTime}
and sort &gt;= #{sort}
and id != #{planId}
ORDER BY sort , update_time desc
limit 1;
</select>
</mapper>
@@ -13,8 +13,20 @@
<result property="color" column="color"/>
<result property="count" column="plateNum"/>
<result property="area" column="area"/>
<result property="goodsId" column="goodsId"/>
<collection property="orderIdList" ofType="com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds" resultMap="OrderIdMap"/>
</resultMap>
<resultMap id="OrderIdMap" type="com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds">
<result property="id" column="id"/>
<result property="orderId" column="orderId"/>
<result property="goodsId" column="goodsId"/>
</resultMap>
<select id="selectGoodsList" resultMap="GoodsListMap" parameterType="java.lang.Long">
@@ -25,13 +37,15 @@
og.height as height,
og.thickness as thickness ,
og.color as color,
count(op.id) as plateNum,
sum(op.area) as area
og.goods_id as goodsId,
og.order_id as orderId,
og.id as id,
count(distinct op.id) as plateNum
from order_plan_item opi
left join order_item oi on opi.item_id = oi.id and opi.organ_id = oi.organ_id
left join order_plate op on oi.plate_id = op.id and oi.organ_id = op.organ_id
left join order_goods og on oi.order_id = og.order_id and oi.organ_id = og.organ_id
left join order_goods og on op.goods_id = og.id and op.organ_id = og.organ_id
where opi.organ_id = #{organId}
and
@@ -40,7 +54,9 @@
#{ids}
</foreach>
group by planId,material,width,height,thickness,color;
and og.goods_id !=0
group by planId,material,width,height,thickness,color,goodsId,orderId,id;
</select>
@@ -6,12 +6,12 @@
count(a.id) as orderCount
from order_goods g
left join order_plate a ON g.id = a.goods_id and a.deleted = 0
left join orders o ON o.id = a.order_id and o.deleted = 0
join orders o ON o.id = a.order_id and o.deleted = 0
where g.deleted = 0
and o.order_date between #{req.createTime[0]} and #{req.createTime[1]}
group by g.goods_id
having orderCount > 0
order by null;
order by orderCount desc
limit 10;
</select>
<select id="selectTopTenPlateCountListGroupByOrderDate" resultType="com.cf.imes.module.executor.controller.admin.order.vo.order.OrderGoodsPlateRespVO">
@@ -40,7 +40,7 @@
</if>
FROM order_goods g
LEFT JOIN order_plate a ON g.id = a.goods_id and a.deleted = 0
LEFT JOIN orders o ON o.id = a.order_id and o.deleted = 0
JOIN orders o ON o.id = a.order_id and o.deleted = 0
WHERE g.deleted = 0
AND o.order_date BETWEEN #{req.createTime[0]} AND #{req.createTime[1]}
and g.goods_id in
@@ -60,8 +60,8 @@
where g.deleted = 0
and o.order_date between #{req.createTime[0]} and #{req.createTime[1]}
group by g.goods_id
having orderArea > 0
order by null;
order by orderArea
limit 10;
</select>
<select id="selectTopTenPlateAreaListGroupByOrderDate"
@@ -123,9 +123,10 @@
<resultMap id="PlateDetialMap" type="com.cf.imes.module.executor.controller.admin.plan.vo.PlateDetialRespVO">
<result property="id" column="plateId"/>
<result property="plateId" column="plateId"/>
<result property="orderId" column="orderId"/>
<result property="goodsId" column="goodsId"/>
<result property="id" column="goodsId"/>
<result property="goodsId" column="plateGoodsId"/>
<result property="plateNo" column="plateNo"/>
<result property="name" column="name"/>
<result property="height" column="height"/>
@@ -189,6 +190,7 @@
op.plate_no as plateNo,
op.type as type,
op.goods_id as goodsId,
ogs.goods_id as plateGoodsId,
op.width as width,
op.height as height,
op.thickness as thickness,
@@ -221,7 +223,6 @@
op.remark as remark,
op.filter_type as filterType,
op.is_cancel as isCancel,
ogs.goods_name as goodsName,
ob.id as bodyId,
ob.room_id as roomId,
@@ -252,6 +253,7 @@
op.plate_no as plateNo,
op.type as type,
op.goods_id as goodsId,
ogs.goods_id as plateGoodsId,
op.width as width,
op.height as height,
op.thickness as thickness,
@@ -284,7 +286,6 @@
op.remark as remark,
op.filter_type as filterType,
op.is_cancel as isCancel,
ogs.goods_name as goodsName,
ob.id as bodyId,
ob.room_id as roomId,
@@ -297,7 +298,7 @@
join order_body ob on oi.body_id = ob.id and oi.organ_id = ob.organ_id
left join order_group og on oi.group_id = og.id and oi.organ_id = og.organ_id
where op.organ_id = #{organId} and op.deleted = false and op.order_id in
where op.organ_id = #{organId} and op.deleted = false and op.id in
<foreach collection="orderIds" item="orderIds" open="(" close=")" separator=",">
@@ -468,11 +469,11 @@
</select>
<select id="selectGoodsPage" resultType="com.cf.imes.module.executor.controller.admin.plan.vo.PlatePage">
<!-- <select id="selectGoodsPage" resultType="com.cf.imes.module.executor.controller.admin.plan.vo.NotPlanOrderPlateRespVO">
select distinct b.id as orderId,
select distinct c.order_id as orderId,
c.id as goodsId,
c.width,
c.height,
@@ -485,7 +486,7 @@
from order_plate a
LEFT JOIN order_item oi on a.id = oi.plate_id and a.order_id = oi.order_id and a.organ_id = oi.organ_id
LEFT JOIN `orders` b on a.order_id = b.id and a.organ_id = b.organ_id
&#45;&#45; LEFT JOIN `orders` b on a.order_id = b.id and a.organ_id = b.organ_id
LEFT JOIN order_goods c on a.goods_id = c.id and a.organ_id = c.organ_id
left join order_plan_item opi on oi.id = opi.item_id and oi.organ_id = opi.organ_id
where
@@ -497,13 +498,65 @@
#{orderIds}
</foreach>
group by c.id,b.id ,c.goods_name,c.width,c.height,c.thickness, c.material, c.color;
group by c.id,c.order_id ,c.goods_name,c.width,c.height,c.thickness, c.material, c.color;
</select>-->
<resultMap id="GoodsPageMap" type="com.cf.imes.module.executor.controller.admin.plan.vo.NotPlanOrderPlateRespVO">
<result property="width" column="width"/>
<result property="height" column="height"/>
<result property="thickness" column="thickness"/>
<result property="goodsName" column="goods_name"/>
<result property="material" column="material"/>
<result property="color" column="color"/>
<result property="texture" column="texture"/>
<result property="brand" column="brand"/>
<result property="goodsId" column="goodsId"/>
<collection property="orderIdList" ofType="com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds" resultMap="OrderIdMap"/>
</resultMap>
<resultMap id="OrderIdMap" type="com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds">
<result property="orderId" column="orderId"/>
<result property="id" column="id"/>
<result property="goodsId" column="goodsId"/>
</resultMap>
<select id="selectGoodsPage"
resultMap="GoodsPageMap">
select distinct
c.texture,
c.width,
c.height,
c.thickness,
c.goods_name,
c.material,
c.color,
c.brand,
c.order_id as orderId,
c.id as id,
c.goods_id as goodsId
from order_plate a
LEFT JOIN order_item oi on a.id = oi.plate_id and a.order_id = oi.order_id and a.organ_id = oi.organ_id
LEFT JOIN order_goods c on a.goods_id = c.id and a.organ_id = c.organ_id
left join order_plan_item opi on oi.id = opi.item_id and oi.organ_id = opi.organ_id
${ew.customSqlSegment}
</select>
<resultMap id="GoodsList" type="com.cf.imes.module.executor.controller.admin.plan.vo.OrderGoodsResp">
<result property="goodsId" column="goodsId"/>
@@ -536,7 +589,7 @@
from order_plate a
LEFT JOIN order_item oi on a.id = oi.plate_id and a.order_id = oi.order_id and a.organ_id = oi.organ_id
LEFT JOIN `orders` b on a.order_id = b.id and a.organ_id = b.organ_id
-- LEFT JOIN `orders` b on a.order_id = b.id and a.organ_id = b.organ_id
LEFT JOIN order_goods c on a.goods_id = c.id and a.organ_id = c.organ_id
left join order_plan_item opi on oi.id = opi.item_id and oi.organ_id = opi.organ_id
where
@@ -564,13 +617,10 @@
c.goods_id as goodsId
from order_plate a
LEFT JOIN order_item oi on a.id = oi.plate_id and a.order_id = oi.order_id and a.organ_id = oi.organ_id
LEFT JOIN `orders` b on a.order_id = b.id and a.organ_id = b.organ_id
LEFT JOIN order_goods c on a.goods_id = c.id and a.organ_id = c.organ_id
left join order_plan_item opi on oi.id = opi.item_id and oi.organ_id = opi.organ_id
where
c.organ_id = #{organId}
and a.is_cancel = 0
and b.status = 2
c.organ_id = #{organId}
and a.deleted = false
and opi.item_id is null
and c.order_id in
@@ -581,6 +631,28 @@
</select>
<!-- select distinct
a.order_id as orderId,
c.id as id,
c.goods_id as goodsId
from order_plate a
LEFT JOIN order_item oi on a.id = oi.plate_id and a.order_id = oi.order_id and a.organ_id = oi.organ_id
LEFT JOIN `orders` b on a.order_id = b.id and a.organ_id = b.organ_id
LEFT JOIN order_goods c on a.goods_id = c.id and a.organ_id = c.organ_id
left join order_plan_item opi on oi.id = opi.item_id and oi.organ_id = opi.organ_id
where
c.organ_id = #{organId}
and a.is_cancel = 0
and b.status = 2
and a.deleted = false
and opi.item_id is null
and c.order_id in
<foreach collection="orderIds" item="orderIds" open="(" close=")" separator=",">
#{orderIds}
</foreach>
order by a.order_id-->
<select id="selectGoodsNum" resultType="com.cf.imes.module.executor.controller.admin.plan.bo.GoodsNum">
@@ -624,6 +696,126 @@
<if test="bodyId != null">
AND i.body_id = #{bodyId}
</if>
GROUP BY
g.goods_id
HAVING
SUM(a.area) > 0
ORDER BY
orderArea DESC;
</select>
<select id="selectPlateListByGoodIds"
resultMap="PlateDetialMap"
resultType="java.lang.Long">
select distinct
oi.group_id as groupId,
og.name as groupName,
op.id as plateId,
op.order_id as orderId,
op.name as name,
op.plate_no as plateNo,
op.type as type,
op.goods_id as goodsId,
op.width as width,
op.height as height,
op.thickness as thickness,
op.split_width as splitWidth,
op.split_height as splitHeight,
op.split_thickness as splitThickness,
op.seal_left as sealLeft,
op.seal_right as sealRight,
op.seal_up as sealUp,
op.seal_down as sealDown,
op.area as area,
op.texture as texture,
op.hole_face as holeFace,
op.hole_arrange as holeArrange,
op.unregular_point_count as unregularPointCount,
op.front_hole_count as frontHoleCount,
op.back_hole_count as backHoleCount,
op.side_hole_count as sideHoleCount,
op.front_model_count as frontModelCount,
op.back_model_count as backModelCount,
op.is_door as isDoor,
op.open_door_type as openDoorType,
op.offset_x as offsetX,
op.offset_y as offsetY,
op.is_arc_across as isArcAcross,
op.module_type_id as moduleTypeId,
op.is_special_shaped as isSpecialShaped,
op.is_sculpt as isSculpt,
op.is_row_hole as hasHole,
op.remark as remark,
op.filter_type as filterType,
op.is_cancel as isCancel,
ob.id as bodyId,
ob.room_id as roomId,
ob.name as bodyName,
ob.room_name as roomName,
op.is_row_hole as hasHole
from order_plate op
left join order_item oi on op.id = oi.plate_id and op.organ_id = oi.organ_id
left join order_body ob on oi.body_id = ob.id and oi.organ_id = ob.organ_id
left join order_group og on oi.group_id = og.id and oi.organ_id = og.organ_id
where op.organ_id = #{organId} and op.deleted = false and op.goods_id in
<foreach collection="goodIds" item="goodIds" open="(" close=")" separator=",">
#{goodIds}
</foreach>
</select>
<select id="selectPlateArea"
resultType="com.cf.imes.module.executor.controller.admin.plan.vo.PlateInfoVO">
select
og.goods_id as goodsId,
-- count(distinct og.id) as optimizeGoodsCount,
sum(op.area) as area
from order_plate op
left join order_goods og on op.goods_id = og.id
where og.organ_id = #{organId} and og.goods_id in
<foreach collection="orderIdsList" item="orderIdsList" open="(" close=")" separator=",">
(#{orderIdsList.goodsId})
</foreach>
and og.order_id in
<foreach collection="orderIdsList" item="orderIdsList" open="(" close=")" separator=",">
(#{orderIdsList.orderId})
</foreach>
group by goodsId;
</select>
<select id="selectTestSQL" resultType="java.util.Map">
select ${filed} from order_plate
where organ_id = #{organId}
and deleted = false
and goods_id in
<foreach collection="goodsIdList" item="goodsIdList" open="(" close=")" separator=",">
#{goodsIdList}
</foreach>
${field2}
</select>
</mapper>
@@ -0,0 +1,13 @@
<?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.cf.imes.module.executor.dal.mysql.remainplaten.RemainPlateMapper">
<select id="selectTestSQL" resultType="java.util.Map">
select ${filed} from order_remain_plate where organ_id = #{organId} and plan_id = #{planId} and deleted = false
</select>
</mapper>