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,29 @@
package com.cf.imes.framework.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum OrderPlateTypeEnum {
LAYERBOARD(0, "层板"),
RISER(1, "立板"),
BACKBOARD(2, "背板"),
SELFINCREASINGBOARD(3, "自增板");
private final Integer type;
private String description;
public boolean equals(Integer status) {
return this.type .equals(status) ;
}
public boolean equals(OrderPlateTypeEnum enableStatusEnum) {
return enableStatusEnum != null && enableStatusEnum.type .equals(this.getType()) ;
}
}
@@ -9,10 +9,11 @@ import lombok.Getter;
public enum PlanStatusEnum {
NEWORDER(0,"新单"),
BOARDHASBEENAPPLIEDFOR(1,"板材已申请"),
DURINGCUTTING(2,"开料中"),
OPENEDMATERIAL(3,"已开料");
NOCUTTING(0, "未开料"),
OPENING(1, "开料中"),
OPENED(2, "已开料");
private Integer status;
private String scheduling;
@@ -33,6 +33,8 @@ public interface GlobalErrorCodeConstants {
ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常");
ErrorCode NOT_IMPLEMENTED = new ErrorCode(501, "功能未实现/未开启");
ErrorCode ERROR_CONFIGURATION = new ErrorCode(502, "错误的配置项");
ErrorCode ES_ERROR_UPDATE = new ErrorCode(503, "ES文档更新失败");
ErrorCode ES_ERROR_DELETE = new ErrorCode(504, "ES文档删除失败");
// ========== 自定义错误段 ==========
ErrorCode REPEATED_REQUESTS = new ErrorCode(900, "重复请求,请稍后重试"); // 重复请求
@@ -0,0 +1,99 @@
package com.cf.imes.framework.common.util.encrypt;
import cn.hutool.core.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.security.GeneralSecurityException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;
/**
* AES对称加密工具
*
* @author Gqr
* @since 2024/8/23 16:38
*/
@Slf4j
public class AesUtils {
private static final String AES_ALG = "AES";
private static final String AES_CBC_PCK_ALG = "AES/CBC/PKCS5Padding";
/**
* 解密
*
* @param content
* @param aesKey
* @return
* @throws Exception
*/
public static String decrypt(String content, String aesKey) {
try {
Cipher cipher = Cipher.getInstance(AES_CBC_PCK_ALG);
IvParameterSpec iv = new IvParameterSpec(initIv(AES_CBC_PCK_ALG));
cipher.init(Cipher.DECRYPT_MODE, generateKey(aesKey.getBytes()), iv);
byte[] cleanBytes = cipher.doFinal(Base64.getDecoder().decode(content.getBytes()));
return new String(cleanBytes, CharsetUtil.UTF_8);
} catch (Exception e) {
log.error("[AesUtils][decrypt]解密失败:{}", e.getMessage(), e);
// nacos热发布配置,空字符串会导致nacos轮训刷新配置
return "default";
}
}
/**
* 生成key
*
* @param bytes
* @return
* @throws NoSuchAlgorithmException
*/
private static SecretKey generateKey(byte[] bytes) throws NoSuchAlgorithmException {
// 生成随机数
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
// 设置随机数种子
random.setSeed(bytes);
// aes算法生成器
KeyGenerator keyGen = KeyGenerator.getInstance(AES_ALG);
keyGen.init(128, random); // 使用128位的密钥
return keyGen.generateKey();
}
/**
* 初始向量的方法, 全部为0. 这里的写法适合于其它算法,针对AES算法的话,IV值一定是128位的(16字节).
*
* @param fullAlg
* @return
* @throws GeneralSecurityException
*/
private static byte[] initIv(String fullAlg) {
try {
Cipher cipher = Cipher.getInstance(fullAlg);
int blockSize = cipher.getBlockSize();
byte[] iv = new byte[blockSize];
for (int i = 0; i < blockSize; ++i) {
iv[i] = 0;
}
return iv;
} catch (Exception e) {
int blockSize = 16;
byte[] iv = new byte[blockSize];
for (int i = 0; i < blockSize; ++i) {
iv[i] = 0;
}
return iv;
}
}
}
@@ -2,7 +2,9 @@ package com.cf.imes.framework.sms.config;
import com.cf.imes.framework.sms.core.client.SmsClientFactory;
import com.cf.imes.framework.sms.core.client.impl.SmsClientFactoryImpl;
import com.cf.imes.framework.sms.core.property.SmsProperties;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
/**
@@ -11,11 +13,12 @@ import org.springframework.context.annotation.Bean;
* @author 晨丰科技
*/
@AutoConfiguration
@EnableConfigurationProperties(SmsProperties.class)
public class ChenfengSmsAutoConfiguration {
@Bean
public SmsClientFactory smsClientFactory() {
return new SmsClientFactoryImpl();
public SmsClientFactory smsClientFactory(SmsProperties smsProperties) {
return new SmsClientFactoryImpl(smsProperties);
}
}
@@ -14,14 +14,6 @@ import java.util.List;
* @since 2021/1/25 14:14
*/
public interface SmsClient {
/**
* 获得渠道编号
*
* @return 渠道编号
*/
Long getId();
/**
* 发送消息
*
@@ -1,6 +1,6 @@
package com.cf.imes.framework.sms.core.client;
import com.cf.imes.framework.sms.core.property.SmsChannelProperties;
import com.cf.imes.framework.sms.core.property.SmsProperties;
/**
* 短信客户端的工厂接口
@@ -9,15 +9,6 @@ import com.cf.imes.framework.sms.core.property.SmsChannelProperties;
* @since 2021/1/28 14:01
*/
public interface SmsClientFactory {
/**
* 获得短信 Client
*
* @param channelId 渠道编号
* @return 短信 Client
*/
SmsClient getSmsClient(Long channelId);
/**
* 获得短信 Client
*
@@ -27,10 +18,11 @@ public interface SmsClientFactory {
SmsClient getSmsClient(String channelCode);
/**
* 创建短信 Client
* 获得短信 Client
*
* @param properties 配置对象
* @param smsProperties 短信配置
* @return 短信 Client
*/
void createOrUpdateSmsClient(SmsChannelProperties properties);
SmsClient getSmsClient(SmsProperties smsProperties);
}
@@ -40,4 +40,13 @@ public class SmsSendRespDTO {
*/
private String apiMsg;
/**
* 短信发送的目标手机号
*/
private String mobile;
/**
* 渠道编码
*/
private String channelCode;
}
@@ -1,7 +1,7 @@
package com.cf.imes.framework.sms.core.client.impl;
import com.cf.imes.framework.sms.core.client.SmsClient;
import com.cf.imes.framework.sms.core.property.SmsChannelProperties;
import com.cf.imes.framework.sms.core.property.SmsProperties;
import lombok.extern.slf4j.Slf4j;
/**
@@ -16,9 +16,9 @@ public abstract class AbstractSmsClient implements SmsClient {
/**
* 短信渠道配置
*/
protected volatile SmsChannelProperties properties;
protected volatile SmsProperties properties;
public AbstractSmsClient(SmsChannelProperties properties) {
public AbstractSmsClient(SmsProperties properties) {
this.properties = properties;
}
@@ -35,7 +35,15 @@ public abstract class AbstractSmsClient implements SmsClient {
*/
protected abstract void doInit();
public final void refresh(SmsChannelProperties properties) {
/**
* 配置是否发生改变
*
* @param properties
* @return
*/
protected abstract boolean propChanged(SmsProperties properties);
public final void refresh(SmsProperties properties) {
// 判断是否更新
if (properties.equals(this.properties)) {
return;
@@ -46,9 +54,4 @@ public abstract class AbstractSmsClient implements SmsClient {
this.init();
}
@Override
public Long getId() {
return properties.getId();
}
}
@@ -1,5 +1,6 @@
package com.cf.imes.framework.sms.core.client.impl;
import cn.hutool.core.util.ObjectUtil;
import com.cf.imes.framework.sms.core.client.SmsClient;
import com.cf.imes.framework.sms.core.client.SmsClientFactory;
import com.cf.imes.framework.sms.core.client.impl.aliyun.AliyunSmsClient;
@@ -7,11 +8,12 @@ import com.cf.imes.framework.sms.core.client.impl.debug.DebugDingTalkSmsClient;
import com.cf.imes.framework.sms.core.client.impl.tencent.TencentSmsClient;
import com.cf.imes.framework.sms.core.enums.SmsChannelEnum;
import com.cf.imes.framework.sms.core.property.SmsChannelProperties;
import com.cf.imes.framework.sms.core.property.SmsProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.validation.annotation.Validated;
import java.util.Arrays;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -22,14 +24,9 @@ import java.util.concurrent.ConcurrentMap;
*/
@Validated
@Slf4j
@Service
public class SmsClientFactoryImpl implements SmsClientFactory {
/**
* 短信客户端 Map
* key:渠道编号,使用 {@link SmsChannelProperties#getId()}
*/
private final ConcurrentMap<Long, AbstractSmsClient> channelIdClients = new ConcurrentHashMap<>();
/**
* 短信客户端 Map
* key:渠道编码,使用 {@link SmsChannelProperties#getCode()} ()}
@@ -39,21 +36,24 @@ public class SmsClientFactoryImpl implements SmsClientFactory {
*/
private final ConcurrentMap<String, AbstractSmsClient> channelCodeClients = new ConcurrentHashMap<>();
public SmsClientFactoryImpl() {
// 初始化 channelCodeClients 集合
Arrays.stream(SmsChannelEnum.values()).forEach(channel -> {
// 创建一个空的 SmsChannelProperties 对象
SmsChannelProperties properties = new SmsChannelProperties().setCode(channel.getCode())
.setApiKey("default default").setApiSecret("default");
// 创建 Sms 客户端
AbstractSmsClient smsClient = createSmsClient(properties);
channelCodeClients.put(channel.getCode(), smsClient);
});
public SmsClientFactoryImpl(SmsProperties smsProperties) {
// 从配置初始化对应的client客户端
AbstractSmsClient client = createSmsClient(smsProperties);
client.init();
channelCodeClients.put(smsProperties.getChannel(), client);
}
@Override
public SmsClient getSmsClient(Long channelId) {
return channelIdClients.get(channelId);
public SmsClient getSmsClient(SmsProperties smsProperties) {
String channel = smsProperties.getChannel();
AbstractSmsClient client = channelCodeClients.get(channel);
// 1、新的短信类型;2、配置改变
if (ObjectUtil.isNull(client) || client.propChanged(smsProperties)) {
client = this.createSmsClient(smsProperties);
client.init();
channelCodeClients.put(channel, client);
}
return client;
}
@Override
@@ -61,30 +61,19 @@ public class SmsClientFactoryImpl implements SmsClientFactory {
return channelCodeClients.get(channelCode);
}
@Override
public void createOrUpdateSmsClient(SmsChannelProperties properties) {
AbstractSmsClient client = channelIdClients.get(properties.getId());
if (client == null) {
client = this.createSmsClient(properties);
client.init();
channelIdClients.put(client.getId(), client);
} else {
client.refresh(properties);
}
}
private AbstractSmsClient createSmsClient(SmsChannelProperties properties) {
SmsChannelEnum channelEnum = SmsChannelEnum.getByCode(properties.getCode());
Assert.notNull(channelEnum, String.format("渠道类型(%s) 为空", channelEnum));
private AbstractSmsClient createSmsClient(SmsProperties smsProperties) {
String channel = smsProperties.getChannel();
SmsChannelEnum channelEnum = SmsChannelEnum.getByCode(channel);
Assert.notNull(channelEnum, String.format("渠道类型(%s) 为空", channel));
// 创建客户端
switch (channelEnum) {
case ALIYUN: return new AliyunSmsClient(properties);
case DEBUG_DING_TALK: return new DebugDingTalkSmsClient(properties);
case TENCENT: return new TencentSmsClient(properties);
case ALIYUN: return new AliyunSmsClient(smsProperties);
case DEBUG_DING_TALK: return new DebugDingTalkSmsClient(smsProperties);
case TENCENT: return new TencentSmsClient(smsProperties);
}
// 创建失败,错误日志 + 抛出异常
log.error("[createSmsClient][配置({}) 找不到合适的客户端实现]", properties);
throw new IllegalArgumentException(String.format("配置(%s) 找不到合适的客户端实现", properties));
log.error("[createSmsClient][配置({}) 找不到合适的客户端实现]", smsProperties);
throw new IllegalArgumentException(String.format("配置(%s) 找不到合适的客户端实现", smsProperties));
}
}
@@ -1,6 +1,8 @@
package com.cf.imes.framework.sms.core.client.impl.aliyun;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import com.aliyuncs.auth.Credential;
import com.cf.imes.framework.common.core.KeyValue;
import com.cf.imes.framework.common.util.collection.MapUtils;
import com.cf.imes.framework.common.util.json.JsonUtils;
@@ -9,7 +11,6 @@ import com.cf.imes.framework.sms.core.client.dto.SmsSendRespDTO;
import com.cf.imes.framework.sms.core.client.dto.SmsTemplateRespDTO;
import com.cf.imes.framework.sms.core.client.impl.AbstractSmsClient;
import com.cf.imes.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
import com.cf.imes.framework.sms.core.property.SmsChannelProperties;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySmsTemplateRequest;
@@ -18,6 +19,7 @@ import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.cf.imes.framework.sms.core.property.SmsProperties;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.annotations.VisibleForTesting;
@@ -56,7 +58,7 @@ public class AliyunSmsClient extends AbstractSmsClient {
*/
private volatile IAcsClient client;
public AliyunSmsClient(SmsChannelProperties properties) {
public AliyunSmsClient(SmsProperties properties) {
super(properties);
Assert.notEmpty(properties.getApiKey(), "apiKey 不能为空");
Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空");
@@ -68,6 +70,23 @@ public class AliyunSmsClient extends AbstractSmsClient {
client = new DefaultAcsClient(profile);
}
@Override
protected boolean propChanged(SmsProperties properties) {
DefaultAcsClient defaultAcsClient = (DefaultAcsClient) client;
if (ObjectUtil.isNotNull(defaultAcsClient)) {
Credential credential = defaultAcsClient.getProfile().getCredential();
String accessKeyId = credential.getAccessKeyId();
if (ObjectUtil.notEqual(properties.getApiKey(), accessKeyId)) {
return true;
}
String accessSecret = credential.getAccessSecret();
if (ObjectUtil.notEqual(properties.getApiSecret(), accessSecret)) {
return true;
}
}
return false;
}
@Override
public SmsSendRespDTO sendSms(Long sendLogId, String mobile, String apiTemplateId,
List<KeyValue<String, Object>> templateParams) throws Throwable {
@@ -81,7 +100,7 @@ public class AliyunSmsClient extends AbstractSmsClient {
// 执行请求
SendSmsResponse response = client.getAcsResponse(request);
return new SmsSendRespDTO().setSuccess(Objects.equals(response.getCode(), API_CODE_SUCCESS)).setSerialNo(response.getBizId())
.setApiRequestId(response.getRequestId()).setApiCode(response.getCode()).setApiMsg(response.getMessage());
.setApiRequestId(response.getRequestId()).setApiCode(response.getCode()).setApiMsg(response.getMessage()).setChannelCode(properties.getChannel());
}
@Override
@@ -3,6 +3,7 @@ package com.cf.imes.framework.sms.core.client.impl.debug;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.crypto.digest.HmacAlgorithm;
@@ -15,7 +16,7 @@ import com.cf.imes.framework.sms.core.client.dto.SmsSendRespDTO;
import com.cf.imes.framework.sms.core.client.dto.SmsTemplateRespDTO;
import com.cf.imes.framework.sms.core.client.impl.AbstractSmsClient;
import com.cf.imes.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
import com.cf.imes.framework.sms.core.property.SmsChannelProperties;
import com.cf.imes.framework.sms.core.property.SmsProperties;
import java.util.HashMap;
import java.util.List;
@@ -31,7 +32,7 @@ import java.util.Objects;
*/
public class DebugDingTalkSmsClient extends AbstractSmsClient {
public DebugDingTalkSmsClient(SmsChannelProperties properties) {
public DebugDingTalkSmsClient(SmsProperties properties) {
super(properties);
Assert.notEmpty(properties.getApiKey(), "apiKey 不能为空");
Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空");
@@ -41,6 +42,11 @@ public class DebugDingTalkSmsClient extends AbstractSmsClient {
protected void doInit() {
}
@Override
protected boolean propChanged(SmsProperties properties) {
return false;
}
@Override
public SmsSendRespDTO sendSms(Long sendLogId, String mobile,
String apiTemplateId, List<KeyValue<String, Object>> templateParams) throws Throwable {
@@ -57,7 +63,7 @@ public class DebugDingTalkSmsClient extends AbstractSmsClient {
Map<?, ?> responseObj = JsonUtils.parseObject(responseText, Map.class);
String errorCode = MapUtil.getStr(responseObj, "errcode");
return new SmsSendRespDTO().setSuccess(Objects.equals(errorCode, "0")).setSerialNo(StrUtil.uuid())
.setApiCode(errorCode).setApiMsg(MapUtil.getStr(responseObj, "errorMsg"));
.setApiCode(errorCode).setApiMsg(MapUtil.getStr(responseObj, "errorMsg")).setMobile(mobile).setChannelCode(properties.getChannel());
}
/**
@@ -75,7 +81,7 @@ public class DebugDingTalkSmsClient extends AbstractSmsClient {
// 生成 sign
String secret = properties.getApiSecret();
String stringToSign = timestamp + "\n" + secret;
byte[] signData = DigestUtil.hmac(HmacAlgorithm.HmacSHA256, StrUtil.bytes(secret)).digest(stringToSign);
byte[] signData = DigestUtil.hmac(HmacAlgorithm.HmacSHA256, CharSequenceUtil.bytes(secret)).digest(stringToSign);
String sign = Base64.encode(signData);
// 构建最终 URL
return String.format("https://oapi.dingtalk.com/%s?access_token=%s&timestamp=%d&sign=%s",
@@ -10,7 +10,7 @@ import com.cf.imes.framework.sms.core.client.dto.SmsSendRespDTO;
import com.cf.imes.framework.sms.core.client.dto.SmsTemplateRespDTO;
import com.cf.imes.framework.sms.core.client.impl.AbstractSmsClient;
import com.cf.imes.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
import com.cf.imes.framework.sms.core.property.SmsChannelProperties;
import com.cf.imes.framework.sms.core.property.SmsProperties;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.annotations.VisibleForTesting;
@@ -56,7 +56,7 @@ public class TencentSmsClient extends AbstractSmsClient {
private SmsClient client;
public TencentSmsClient(SmsChannelProperties properties) {
public TencentSmsClient(SmsProperties properties) {
super(properties);
Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空");
validateSdkAppId(properties);
@@ -69,6 +69,11 @@ public class TencentSmsClient extends AbstractSmsClient {
client = new SmsClient(credential, ENDPOINT);
}
@Override
protected boolean propChanged(SmsProperties properties) {
return false;
}
/**
* 参数校验腾讯云的 SDK AppId
*
@@ -78,7 +83,7 @@ public class TencentSmsClient extends AbstractSmsClient {
*
* @param properties 配置
*/
private static void validateSdkAppId(SmsChannelProperties properties) {
private static void validateSdkAppId(SmsProperties properties) {
String combineKey = properties.getApiKey();
Assert.notEmpty(combineKey, "apiKey 不能为空");
String[] keys = combineKey.trim().split(" ");
@@ -108,7 +113,7 @@ public class TencentSmsClient extends AbstractSmsClient {
SendSmsResponse response = client.SendSms(request);
SendStatus status = response.getSendStatusSet()[0];
return new SmsSendRespDTO().setSuccess(Objects.equals(status.getCode(), API_CODE_SUCCESS)).setSerialNo(status.getSerialNo())
.setApiRequestId(response.getRequestId()).setApiCode(status.getCode()).setApiMsg(status.getMessage());
.setApiRequestId(response.getRequestId()).setApiCode(status.getCode()).setApiMsg(status.getMessage()).setChannelCode(properties.getChannel());
}
@Override
@@ -0,0 +1,76 @@
package com.cf.imes.framework.sms.core.property;
import com.cf.imes.framework.common.util.encrypt.AesUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotEmpty;
/**
* @author Gqr
* @since 2024/8/23 10:51
*/
@ConfigurationProperties(prefix = "chenfeng.sms")
@Validated
public class SmsProperties {
@Value("${chenfeng.encrypt.publicKey:}")
private String publicKey;
/**
* 短信渠道
*/
@NotEmpty(message = "短信渠道不能为空")
private String channel;
/**
* 短信签名
*/
private String signature;
/**
* 短信 API 的账号
*/
@NotEmpty(message = "短信apiKey不能为空")
private String apiKey;
/**
* 短信 API 的密钥
*/
@NotEmpty(message = "短信apiSecret不能为空")
private String apiSecret;
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
public String getSignature() {
return signature;
}
public SmsProperties setSignature(String signature) {
this.signature = AesUtils.decrypt(signature, publicKey);
return this;
}
public String getApiKey() {
return apiKey;
}
public SmsProperties setApiKey(String apiKey) {
this.apiKey = AesUtils.decrypt(apiKey, publicKey);
return this;
}
public String getApiSecret() {
return apiSecret;
}
public SmsProperties setApiSecret(String apiSecret) {
this.apiSecret = AesUtils.decrypt(apiSecret, publicKey);
return this;
}
}
@@ -7,7 +7,7 @@ import com.cf.imes.framework.sms.core.client.dto.SmsReceiveRespDTO;
import com.cf.imes.framework.sms.core.client.dto.SmsSendRespDTO;
import com.cf.imes.framework.sms.core.client.dto.SmsTemplateRespDTO;
import com.cf.imes.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
import com.cf.imes.framework.sms.core.property.SmsChannelProperties;
import com.cf.imes.framework.sms.core.property.SmsProperties;
import com.cf.imes.framework.test.core.ut.BaseMockitoUnitTest;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySmsTemplateRequest;
@@ -37,7 +37,7 @@ import static org.mockito.Mockito.when;
*/
public class AliyunSmsClientTest extends BaseMockitoUnitTest {
private final SmsChannelProperties properties = new SmsChannelProperties()
private final SmsProperties properties = new SmsProperties()
.setApiKey(randomString()) // 随机一个 apiKey,避免构建报错
.setApiSecret(randomString()) // 随机一个 apiSecret,避免构建报错
.setSignature("晨丰科技");
@@ -9,7 +9,7 @@ import com.cf.imes.framework.sms.core.client.dto.SmsReceiveRespDTO;
import com.cf.imes.framework.sms.core.client.dto.SmsSendRespDTO;
import com.cf.imes.framework.sms.core.client.dto.SmsTemplateRespDTO;
import com.cf.imes.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
import com.cf.imes.framework.sms.core.property.SmsChannelProperties;
import com.cf.imes.framework.sms.core.property.SmsProperties;
import com.cf.imes.framework.test.core.ut.BaseMockitoUnitTest;
import com.google.common.collect.Lists;
import com.tencentcloudapi.sms.v20210111.SmsClient;
@@ -39,7 +39,7 @@ import static org.mockito.Mockito.when;
*/
public class TencentSmsClientTest extends BaseMockitoUnitTest {
private final SmsChannelProperties properties = new SmsChannelProperties()
private final SmsProperties properties = new SmsProperties()
.setApiKey(randomString() + " " + randomString()) // 随机一个 apiKey,避免构建报错
.setApiSecret(randomString()) // 随机一个 apiSecret,避免构建报错
.setSignature("晨丰科技");
@@ -64,7 +64,7 @@ public class TencentSmsClientTest extends BaseMockitoUnitTest {
@Test
public void testRefresh() {
// 准备参数
SmsChannelProperties p = new SmsChannelProperties()
SmsProperties p = new SmsProperties()
.setApiKey(randomString() + " " + randomString()) // 随机一个 apiKey,避免构建报错
.setApiSecret(randomString()) // 随机一个 apiSecret,避免构建报错
.setSignature("晨丰科技");
@@ -1,7 +1,6 @@
package com.cf.imes.framework.es.core.service;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
@@ -17,9 +16,6 @@ import java.io.IOException;
import java.io.StringReader;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -146,6 +142,7 @@ public class ESDocumentServiceImpl implements ESDocumentService {
esDocument.setCreator(loginUser.getNickname());
esDocument.setCreateTime(simpleDateFormat.format(date));
esDocument.setUpdater(loginUser.getNickname());
esDocument.setOrganId(loginUser.getOrganId());
esDocument.setUpdateTime(simpleDateFormat.format(date));
br.operations(op -> op.index(idx -> idx
@@ -0,0 +1,24 @@
package com.cf.imes.framework.datasource.config;
import com.baomidou.dynamic.datasource.event.DataSourceInitEvent;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration;
import com.cf.imes.framework.mybatis.core.event.ChenfengDataSourceEncryptInitEvent;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
/**
* @author Gqr
* @since 2024/8/26 18:20
*/
@AutoConfiguration
@AutoConfigureBefore(DynamicDataSourceAutoConfiguration.class)
public class ChenfengDataSourceEncryptConfiguration {
@Bean
@ConditionalOnProperty(name = "chenfeng.encrypt.enable", havingValue = "true")
public DataSourceInitEvent getDataSourceInitEvent() {
return new ChenfengDataSourceEncryptInitEvent();
}
}
@@ -0,0 +1,41 @@
package com.cf.imes.framework.mybatis.core.event;
import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
import com.baomidou.dynamic.datasource.event.DataSourceInitEvent;
import com.cf.imes.framework.common.util.encrypt.AesUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import javax.sql.DataSource;
/**
* @author Gqr
* @since 2024/8/27 9:09
*/
public class ChenfengDataSourceEncryptInitEvent implements DataSourceInitEvent {
@Value("${chenfeng.encrypt.publicKey:}")
private String publicKey;
/**
* 数据源创建前
*
* @param dataSourceProperty 数据源基础信息
*/
@Override
public void beforeCreate(DataSourceProperty dataSourceProperty) {
if (StringUtils.isNotEmpty(publicKey)) {
dataSourceProperty.setUsername(AesUtils.decrypt(dataSourceProperty.getUsername(), publicKey));
dataSourceProperty.setPassword(AesUtils.decrypt(dataSourceProperty.getPassword(), publicKey));
}
}
/**
* 数据源创建后
*
* @param dataSource 连接池
*/
@Override
public void afterCreate(DataSource dataSource) {
}
}
@@ -1,10 +1,10 @@
package com.cf.imes.framework.mybatis.core.query;
import cn.hutool.core.lang.Assert;
import com.cf.imes.framework.mybatis.core.enums.SqlConstants;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.cf.imes.framework.mybatis.core.enums.SqlConstants;
import org.springframework.util.StringUtils;
import java.util.Collection;
@@ -145,6 +145,12 @@ public class QueryWrapperX<T> extends QueryWrapper<T> {
return this;
}
@Override
public QueryWrapperX<T> isNotNull(String column) {
super.isNotNull(column);
return this;
}
/**
* 设置只返回最后一条
*
@@ -20,10 +20,11 @@ public class CompressStringTypeHandler extends StringTypeHandler {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)
throws SQLException {
String compressString = null;
if (StringUtils.isNotEmpty(parameter)) {
String compressString = JsonUtils.zipString(parameter);
ps.setString(i, compressString);
compressString = JsonUtils.zipString(parameter);
}
ps.setString(i, compressString);
}
@Override
@@ -1,2 +1,3 @@
com.cf.imes.framework.datasource.config.ChenfengDataSourceEncryptConfiguration
com.cf.imes.framework.datasource.config.ChenfengDataSourceAutoConfiguration
com.cf.imes.framework.mybatis.config.ChenfengMybatisAutoConfiguration
@@ -0,0 +1,77 @@
package com.cf.imes.framework.redis.config;
import cn.hutool.core.bean.BeanUtil;
import com.cf.imes.framework.common.util.encrypt.AesUtils;
import org.redisson.config.ClusterServersConfig;
import org.redisson.config.Config;
import org.redisson.config.MasterSlaveServersConfig;
import org.redisson.config.ReplicatedServersConfig;
import org.redisson.config.SentinelServersConfig;
import org.redisson.config.SingleServerConfig;
import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.util.StringUtils;
/**
* @author Gqr
* @since 2024/8/27 9:46
*/
@AutoConfiguration
public class ChenfengRedisEncryptAutoConfiguration {
@Value("${chenfeng.encrypt.publicKey:}")
private String publicKey;
@Bean
@ConditionalOnProperty(name = "chenfeng.encrypt.enable", havingValue = "true")
public RedissonAutoConfigurationCustomizer redissonAutoConfigurationCustomizer() {
return configuration -> {
Config redissonConfig = new Config();
BeanUtil.copyProperties(configuration, redissonConfig);
String password;
SingleServerConfig singleServerConfig = redissonConfig.useSingleServer();
if (singleServerConfig != null) {
password = singleServerConfig.getPassword();
singleServerConfig.setPassword(
StringUtils.isEmpty(password) ? null : AesUtils.decrypt(password, publicKey));
return;
}
MasterSlaveServersConfig masterSlaveServersConfig = redissonConfig.useMasterSlaveServers();
if (masterSlaveServersConfig != null) {
password = masterSlaveServersConfig.getPassword();
masterSlaveServersConfig.setPassword(
StringUtils.isEmpty(password) ? null : AesUtils.decrypt(password, publicKey));
return;
}
SentinelServersConfig sentinelServersConfig = redissonConfig.useSentinelServers();
if (sentinelServersConfig != null) {
password = sentinelServersConfig.getPassword();
sentinelServersConfig.setPassword(
StringUtils.isEmpty(password) ? null : AesUtils.decrypt(password, publicKey));
return;
}
ClusterServersConfig clusterServersConfig = redissonConfig.useClusterServers();
if (clusterServersConfig != null) {
password = clusterServersConfig.getPassword();
clusterServersConfig.setPassword(
StringUtils.isEmpty(password) ? null : AesUtils.decrypt(password, publicKey));
return;
}
ReplicatedServersConfig replicatedServersConfig = redissonConfig.useReplicatedServers();
if (replicatedServersConfig != null) {
password = replicatedServersConfig.getPassword();
replicatedServersConfig.setPassword(
StringUtils.isEmpty(password) ? null : AesUtils.decrypt(password, publicKey));
}
};
}
}
@@ -1,2 +1,3 @@
com.cf.imes.framework.redis.config.ChenfengRedisAutoConfiguration
com.cf.imes.framework.redis.config.ChenfengRedisEncryptAutoConfiguration
com.cf.imes.framework.redis.config.ChenfengCacheAutoConfiguration
@@ -1,6 +1,5 @@
package com.cf.imes.framework.security.core.util;
import cn.hutool.core.util.StrUtil;
import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants;
import com.cf.imes.framework.security.core.LoginUser;
@@ -44,7 +43,7 @@ public class SecurityFrameworkUtils {
String headerName, String parameterName) {
// 1. 获得 Token。优先级:Header > Parameter
String token = request.getHeader(headerName);
if (StrUtil.isEmpty(token)) {
if (StringUtils.isEmpty(token)) {
token = request.getParameter(parameterName);
}
if (!StringUtils.hasText(token)) {
@@ -63,7 +62,7 @@ public class SecurityFrameworkUtils {
public static Authentication getAuthentication() {
SecurityContext context = SecurityContextHolder.getContext();
if (context == null) {
return null;
throw new ServiceException(GlobalErrorCodeConstants.UNAUTHORIZED);
}
return context.getAuthentication();
}
@@ -90,10 +89,7 @@ public class SecurityFrameworkUtils {
@Nullable
public static Long getLoginUserId() {
LoginUser loginUser = getLoginUser();
if (loginUser == null) {
throw new ServiceException(GlobalErrorCodeConstants.UNAUTHORIZED);
}
return loginUser.getId();
return loginUser != null ? loginUser.getId() : null;
}
/**
@@ -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>
@@ -2,10 +2,7 @@ package com.cf.imes.module.manage.controller.admin.pack;
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.excel.core.util.ExcelUtils;
import com.cf.imes.framework.operatelog.core.annotations.OperateLog;
import com.cf.imes.module.manage.controller.admin.pack.prePack.PrePackReqVO;
import com.cf.imes.module.manage.controller.admin.pack.vo.*;
import com.cf.imes.module.manage.controller.admin.query.vo.pack.OrderPackageVO;
@@ -20,14 +17,10 @@ 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 java.io.IOException;
import java.util.List;
import static com.cf.imes.framework.common.pojo.CommonResult.success;
import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@Tag(name = "管理后台 - 生产打包 ")
@RestController
@@ -80,15 +73,25 @@ public class PackController {
@GetMapping("/getOrderPack")
@Operation(summary = "查看生产订单对应的包裹信息")
@Operation(summary = "查看生产订单对应的包裹信息-未分页")
@PreAuthorize("@ss.hasPermission('manage:pack:query')")
public CommonResult<PageResult<OrderPackageVO>> getOrderPack(@Valid PackageDetailsReqVO reqVO) {
public CommonResult<List<OrderPackageVO>> getOrderPack(@Valid PackageDetailsReqVO reqVO) {
return success(packService.getOrderPack(reqVO));
}
@GetMapping("/getPageOrderPack")
@Operation(summary = "查看生产订单对应的包裹信息-分页")
@PreAuthorize("@ss.hasPermission('manage:pack:query')")
public CommonResult<PageResult<OrderPackageVO>> getPageOrderPack(@Valid PackageDetailsReqVO reqVO) {
return success(packService.getPageOrderPack(reqVO));
}
@GetMapping("/queryPackageDetails")
@Operation(summary = "查询包裹的详细信息")
@@ -1,13 +1,15 @@
package com.cf.imes.module.manage.dal.mysql.pack;
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.OrderPackageStatusEnum;
import com.cf.imes.framework.common.enums.OrderPackageTypeEnum;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.module.manage.controller.admin.pack.vo.PackRespVO;
import com.cf.imes.module.manage.controller.admin.pack.vo.PackageDetailsReqVO;
import com.cf.imes.module.manage.controller.admin.pack.vo.PlateAndPartIdList;
import com.cf.imes.module.manage.controller.admin.pack.vo.PlateDetailsRespVO;
import com.cf.imes.module.manage.controller.admin.query.vo.pack.OrderPackageVO;
@@ -29,8 +31,9 @@ public interface OrderPackageMapper extends BaseMapperX<OrderPackageDO> {
// }
IPage<OrderPackageVO> selectByOrderNo(@Param("page") IPage page, @Param("reqVO") PackageDetailsReqVO reqVO, @Param("organId") Long organId);
// IPage<OrderPackageVO> selectByOrderNo(@Param("page") IPage page, @Param("reqVO") PackageDetailsReqVO reqVO,@Param("packId") List<Long> packId, @Param("organId") Long organId);
IPage<OrderPackageVO> selectByOrderNo(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper<OrderPackageDO> wrapper);
default OrderPackageDO selectByPackNo(String packNo,Long organId) {
return selectOne(new LambdaQueryWrapperX<OrderPackageDO>()
@@ -81,10 +84,16 @@ public interface OrderPackageMapper extends BaseMapperX<OrderPackageDO> {
// 删除当前生产单下所有的包裹
default void updateDelete(Long orderId) {
default void updateDelete(Long orderId,Long organId) {
LambdaUpdateWrapper<OrderPackageDO> wrapper = new LambdaUpdateWrapper<OrderPackageDO>()
.set(OrderPackageDO::getDeleted, true)
.eq(OrderPackageDO::getOrderId, orderId);
.eq(OrderPackageDO::getOrganId,organId)
.eq(OrderPackageDO::getOrderId, orderId)
.eq(OrderPackageDO::getType, OrderPackageTypeEnum.PLATE.getType());
update(wrapper);
}
List<OrderPackageVO> selectPackListByOrderId(@Param("orderId") Long orderId,@Param("organId") Long organId);
}
@@ -3,10 +3,8 @@ package com.cf.imes.module.manage.dal.mysql.plate;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.module.manage.controller.admin.patching.vo.PatchingDetailReqVO;
import com.cf.imes.module.manage.controller.admin.patching.vo.PatchingDetailRespVO;
import com.cf.imes.module.manage.controller.admin.patching.vo.PatchingPlatePageReqVO;
import com.cf.imes.module.manage.controller.admin.process.vo.OrderPlateReqVO;
import com.cf.imes.module.manage.controller.admin.process.vo.PlateDetails;
import com.cf.imes.module.manage.dal.dataobject.plate.OrderPlateDO;
import org.apache.ibatis.annotations.Mapper;
@@ -38,4 +36,13 @@ public interface OrderPlateMapper extends BaseMapperX<OrderPlateDO> {
.in(OrderPlateDO::getPlateNo, plateNo));
}
default List<OrderPlateDO> selectplateByPlateNo(Long plateNo, Long orderId, Long organId) {
return selectList(new LambdaQueryWrapperX<OrderPlateDO>()
.eq(OrderPlateDO::getOrganId, organId)
.eq(OrderPlateDO::getOrderId, orderId)
.likeIfPresent(OrderPlateDO::getPlateNo, plateNo.toString())
.select(OrderPlateDO::getId));
}
}
@@ -1,4 +1,4 @@
package com.cf.imes.module.manage.dal.mysql.query;
package com.cf.imes.module.manage.dal.mysql.process;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -9,17 +9,15 @@ import com.cf.imes.module.manage.controller.admin.pack.vo.PackPageReqVO;
import com.cf.imes.module.manage.controller.admin.pack.vo.PackRespVO;
import com.cf.imes.module.manage.controller.admin.pack.vo.PrintOrderPackRespVO;
import com.cf.imes.module.manage.controller.admin.query.vo.productionStatus.OrderPlatePageReqVO;
import com.cf.imes.module.manage.controller.admin.query.vo.pack.PrintOrderRespVO;
import com.cf.imes.module.manage.dal.dataobject.process.OrderDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId;
@Mapper
public interface ProductionStatusMapper extends BaseMapperX<OrderDO> {
public interface OrdersMapper extends BaseMapperX<OrderDO> {
default PageResult<OrderDO> selectProductionPage(OrderPlatePageReqVO pageReqVO) {
@@ -38,32 +36,24 @@ public interface ProductionStatusMapper extends BaseMapperX<OrderDO> {
List<PackRespVO> selectOrderIds( @Param("createTime") String createTime, @Param("organId") Long organId, @Param("orderId") Long orderId);
PrintOrderRespVO selectPrintOrder(@Param("orderNo") Long orderNo,@Param("organId")Long organId);
// default List<OrderDO> selectOrderIds(PackPageReqVO pageReqVO,Long organId) {
// return selectList(new LambdaQueryWrapperX<OrderDO>()
// .eq(OrderDO::getOrganId,organId)
// .eqIfPresent(OrderDO::getId, pageReqVO.getOrderId())
// .eqIfPresent(OrderDO::getCustomOrderNo, pageReqVO.getCustomOrderNo())
// .likeIfPresent(OrderDO::getCustomer, pageReqVO.getCustomer())
// .likeIfPresent(OrderDO::getAddress, pageReqVO.getAddress())
// .eqIfPresent(OrderDO::getStatus, pageReqVO.getStatus())
// .orderByDesc(OrderDO::getCreateTime));
// }
IPage<PackRespVO> selectOrderPlate( @Param("page") IPage page, @Param("orderIds") List<Long> orderIds, @Param("organId") Long organId);
List<PackRespVO> selectOrderIdsFalse( @Param("createTime") String createTime,@Param("organId") Long organId, @Param("orderId") Long orderId);
PrintOrderPackRespVO selectOrderPack(@Param("orderNo")Long orderNo,@Param("packageNo") Long packageNo, @Param("organId") Long organId);
IPage<PackRespVO> selectOrderPlate(@Param("page") IPage page, @Param("orderIds") List<Long> orderIds, @Param("organId") Long organId);
List<OrderDO> selectOrderIds(@Param("pageReqVO") PackPageReqVO pageReqVO,@Param("organId") Long organId);
PrintOrderPackRespVO selectOrderPack(@Param("orderNo")Long orderNo, @Param("packageNo") Long packageNo, @Param("organId") Long organId);
IPage<PackRespVO> selectOrderIdList(@Param("page") IPage page, @Param("pageReqVO") PackPageReqVO pageReqVO, @Param("organId") Long organId);
}
@@ -1,42 +0,0 @@
package com.cf.imes.module.manage.dal.mysql.process;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.module.manage.controller.admin.patching.vo.PatchingPlatePageReqVO;
import com.cf.imes.module.manage.controller.admin.patching.vo.PatchingPlateRespVO;
import com.cf.imes.module.manage.dal.dataobject.process.OrderDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.List;
/**
* 生产单表 order_{N} Mapper
*
* @author 晨丰科技
*/
@Mapper
public interface ProductionProcessMapper extends BaseMapperX<OrderDO> {
List<PatchingPlateRespVO> selectPatchingPlate(PatchingPlatePageReqVO pageReqVO);
OrderDO selectOrderIds(@Param("createTime") String createTime, @Param("organId") Long organId, @Param("orderId") Long orderId);
OrderDO selectOrderIdsFalse(@Param("createTime") String createTime,@Param("organId") Long organId, @Param("orderId") Long orderId);
// OrderDO selectOrderIds(@Param("orderId") Long orderId,@Param("organId") Long organId);
//
// OrderDO selectOrderIdsFalse(@Param("orderId") Long orderId,@Param("organId") Long userOrganId);
}
@@ -1,12 +1,11 @@
package com.cf.imes.module.manage.dal.mysql.query;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.module.manage.controller.admin.pack.vo.*;
import com.cf.imes.module.manage.controller.admin.process.vo.OrderPlateReqVO;
import com.cf.imes.module.manage.controller.admin.pack.vo.OrderPlateDetailsRespVO;
import com.cf.imes.module.manage.controller.admin.pack.vo.PackRespVO;
import com.cf.imes.module.manage.controller.admin.pack.vo.PlateDetailsRespVO;
import com.cf.imes.module.manage.controller.admin.process.vo.PlateDetails;
import com.cf.imes.module.manage.controller.admin.process.vo.ProcessPlateReqVO;
import com.cf.imes.module.manage.controller.admin.query.vo.pack.PackageDetailsRespVO;
@@ -14,13 +13,10 @@ import com.cf.imes.module.manage.controller.admin.query.vo.productionStatus.Orde
import com.cf.imes.module.manage.controller.admin.query.vo.productionStatus.OrderPlateRespVO;
import com.cf.imes.module.manage.controller.admin.query.vo.productionStatus.PlatePageVO;
import com.cf.imes.module.manage.dal.dataobject.query.OrderItemDO;
import com.cf.imes.module.manage.dal.dataobject.query.OrderPackageDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.stream.Collectors;
@Mapper
public interface OrderItemMapper extends BaseMapperX<OrderItemDO> {
@@ -98,4 +94,24 @@ public interface OrderItemMapper extends BaseMapperX<OrderItemDO> {
.eqIfPresent(OrderItemDO::getOrderId, orderId));
}
List<PackRespVO> selectPlateNum(@Param("orderIds") List<Long> orderIds,@Param("organId") Long organId);
default List<OrderItemDO> selectPartsList(Long orderId, Long organId) {
return selectList(new LambdaQueryWrapperX<OrderItemDO>()
.eq(OrderItemDO::getOrganId, organId)
.eqIfPresent(OrderItemDO::getOrderId, orderId)
.eq(OrderItemDO::getPackageId,0)
.select(OrderItemDO::getPartsId));
}
default List<OrderItemDO> selectPackByPlateId(List<Long> plateId, Long organId) {
return selectList(new LambdaQueryWrapperX<OrderItemDO>()
.eq(OrderItemDO::getOrganId, organId)
.inIfPresent(OrderItemDO::getPlateId, plateId)
.select(OrderItemDO::getPackageId));
}
}
@@ -16,9 +16,11 @@ public interface PackService {
// 查看生产订单对应的包裹信息
PageResult<OrderPackageVO> getOrderPack(PackageDetailsReqVO reqVO);
List<OrderPackageVO> getOrderPack(PackageDetailsReqVO reqVO);
PageResult<OrderPackageVO> getPageOrderPack(PackageDetailsReqVO reqVO);
// 查看生产订单对应的板材信息
List<PlateDetailsRespVO> getOrderPlateList(Long orderId);
@@ -10,6 +10,7 @@ import com.cf.imes.framework.common.enums.UserSettingTypeEnum;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.json.JsonUtils;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.mybatis.core.query.QueryWrapperX;
import com.cf.imes.module.manage.controller.admin.pack.prePack.PackPlateList;
import com.cf.imes.module.manage.controller.admin.pack.prePack.PrePackOptimizeInfo;
import com.cf.imes.module.manage.controller.admin.pack.prePack.PrePackReqVO;
@@ -25,13 +26,10 @@ import com.cf.imes.module.manage.dal.mysql.pack.OrderBodyMapper;
import com.cf.imes.module.manage.dal.mysql.pack.OrderPackageMapper;
import com.cf.imes.module.manage.dal.mysql.pack.OrderPrepackagedMapper;
import com.cf.imes.module.manage.dal.mysql.plate.OrderPlateMapper;
import com.cf.imes.module.manage.dal.mysql.process.ProcessStepItemMapper;
import com.cf.imes.module.manage.dal.mysql.process.ProcessStepMapper;
import com.cf.imes.module.manage.dal.mysql.process.ProductionProcessMapper;
import com.cf.imes.module.manage.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.manage.dal.mysql.process.OrdersMapper;
import com.cf.imes.module.manage.dal.mysql.query.OrderItemMapper;
import com.cf.imes.module.manage.dal.mysql.query.OrderPartsMapper;
import com.cf.imes.module.manage.dal.mysql.query.ProductionStatusMapper;
import com.cf.imes.module.manage.service.process.ProductionProcessServiceImpl;
import com.cf.imes.module.manage.util.SnowflakeIdWorker3rd;
import com.cf.imes.module.system.api.setting.SettingApi;
import com.cf.imes.module.system.api.setting.dto.PackageConfigDTO;
@@ -64,8 +62,6 @@ public class PackServiceImpl implements PackService {
@Resource
private OrderPackageMapper orderPackageMapper;
@Resource
private ProductionStatusMapper productionStatusMapper;
@Resource
private OrderItemMapper orderItemMapper;
@@ -80,16 +76,11 @@ public class PackServiceImpl implements PackService {
private OrderPlateMapper orderPlateMapper;
@Resource
private ProcessStepMapper processStepMapper;
private OrdersMapper ordersMapper;
@Resource
private ProductionProcessServiceImpl productionProcessService;
private PlateMapper plateMapper;
@Resource
private ProcessStepItemMapper processStepItemMapper;
@Resource
private ProductionProcessMapper productionProcessMapper;
@Resource
private SnowflakeIdWorker3rd idWorker;
@@ -110,48 +101,62 @@ public class PackServiceImpl implements PackService {
List<Long> orderIds = new ArrayList<>();
IPage<PackRespVO> packRespVOS = new PageDTO<>();
if(pageReqVO.getIsUp() != null){
OrderDO order = productionProcessMapper.selectById(pageReqVO.getOrderId());
OrderDO order = ordersMapper.selectById(pageReqVO.getOrderId());
OrderDO orderDO = pageReqVO.getIsUp() ?
productionProcessMapper.selectOrderIds(order.getCreateTime().toString(), getUserOrganId(),order.getId()) :
List<PackRespVO> packRespVOList = pageReqVO.getIsUp() ?
ordersMapper.selectOrderIds(order.getCreateTime().toString(), getUserOrganId(),order.getId()) :
productionProcessMapper.selectOrderIdsFalse(order.getCreateTime().toString(), getUserOrganId(),order.getId());
ordersMapper.selectOrderIdsFalse(order.getCreateTime().toString(), getUserOrganId(),order.getId());
if(orderDO == null){
if(packRespVOList.isEmpty()){
throw exception(NO_PRODUCTION_ORDER_INFORMATION_AVAILABLE, pageReqVO.getIsUp() ?"" : "最后");
}
orderIds.add(orderDO.getId());
packRespVOS.setRecords(packRespVOList);
orderIds.addAll(packRespVOS.getRecords().stream().map(PackRespVO::getId).toList());
}else {
pageReqVO.setCustomer(insertSeparator(pageReqVO.getCustomer()));
pageReqVO.setCustomOrderNo(insertSeparator(pageReqVO.getCustomOrderNo()));
pageReqVO.setAddress(insertSeparator(pageReqVO.getAddress()));
// 根据生产状态查询生产单号
// List<Long> orderIds = productionStatusMapper.selectOrderIds(pageReqVO, getUserOrganId()).stream().map(OrderDO::getId).toList();
orderIds.addAll(productionStatusMapper.selectOrderIds(pageReqVO, getUserOrganId()).stream().map(OrderDO::getId).toList());
// 查询查询分页
packRespVOS = ordersMapper.selectOrderIdList(page,pageReqVO, getUserOrganId());
orderIds.addAll(packRespVOS.getRecords().stream().map(PackRespVO::getId).toList());
if (orderIds.isEmpty()) {
return null;
}
}
// 查询打包首页分页数据信息,总的板件数量信息
IPage<PackRespVO> packRespVOS = productionStatusMapper.selectOrderPlate(page,orderIds,getUserOrganId());
// 查询板材的总量
List<PackRespVO> packRespVOList = orderItemMapper.selectPlateNum(orderIds,getUserOrganId());
// 查询当前生产的包裹数量
List<PackRespVO> respVOS = orderPackageMapper.selectPackPage(orderIds,getUserOrganId());
// 查询当前生产单已经打包的板材数量
List<PackRespVO> plateNum = orderPackageMapper.selectPackPieceCount(orderIds, getUserOrganId());
for (PackRespVO record : packRespVOS.getRecords()) {
// 板材总数
record.setTotalPieceCount(packRespVOList.stream().filter(f -> Objects.equals(f.getId(), record.getId())).mapToLong(PackRespVO::getTotalPieceCount).sum());
// 已打包数
record.setPackCount(respVOS.stream().filter(f -> Objects.equals(f.getId(), record.getId())).mapToLong(PackRespVO::getPackCount).sum());
// 已打包片数
@@ -238,13 +243,73 @@ public class PackServiceImpl implements PackService {
}
// 查看生产订单对应的包裹信息
@Override
public PageResult<OrderPackageVO> getOrderPack(PackageDetailsReqVO reqVO) {
public List<OrderPackageVO> getOrderPack(PackageDetailsReqVO reqVO) {
List<OrderPackageVO> orderPackageVOS = orderPackageMapper.selectPackListByOrderId(reqVO.getOrderId(), getUserOrganId());
OrderDO orderDO = ordersMapper.selectById(reqVO.getOrderId());
// for (OrderPackageVO orderPackageVO : orderPackageVOS) {
// orderPackageVO.setCustomOrderNo(orderDO.getCustomOrderNo());
// orderPackageVO.setCustomer(orderDO.getCustomer());
// orderPackageVO.setAddress(orderDO.getAddress());
// orderPackageVO.setDealer(orderDO.getDealer());
// orderPackageVO.setOrderRemark(orderDO.getRemark());
// }
return orderPackageVOS.stream().peek(m -> {
m.setCustomOrderNo(orderDO.getCustomOrderNo());
m.setCustomer(orderDO.getCustomer());
m.setAddress(orderDO.getAddress());
m.setDealer(orderDO.getDealer());
m.setOrderRemark(orderDO.getRemark());
}
).toList();
}
@Override
public PageResult<OrderPackageVO> getPageOrderPack(PackageDetailsReqVO reqVO) {
PageDTO<OrderPackageVO> page = new PageDTO<>(reqVO.getPageNo(), reqVO.getPageSize());
IPage<OrderPackageVO> orderPackageDOIPage = orderPackageMapper.selectByOrderNo(page,reqVO, getUserOrganId());
List<Long> packId = null;
if(reqVO.getPlateNo()!= null){
List<Long> plateId = orderPlateMapper.selectplateByPlateNo(reqVO.getPlateNo(), reqVO.getOrderId(), getUserOrganId())
.stream().map(OrderPlateDO::getId).toList();
if(plateId.isEmpty()){
return null;
}
packId = orderItemMapper.selectPackByPlateId(plateId, getUserOrganId()).stream().map(OrderItemDO::getPackageId).distinct().toList();
}
QueryWrapperX<OrderPackageDO> queryWrapperX = new QueryWrapperX<>();
queryWrapperX
.eq("o.organ_id",getUserOrganId())
.eq("o.deleted",false)
.eq("op.deleted",false)
.eq("o.id",reqVO.getOrderId())
.likeIfPresent("op.package_no",reqVO.getPackageNo())
.inIfPresent("op.id",packId)
.eqIfPresent("op.status", reqVO.getPackStatus())
.orderByDesc("op.create_time");
IPage<OrderPackageVO> orderPackageDOIPage = orderPackageMapper.selectByOrderNo(page,queryWrapperX);
if (CollectionUtil.isEmpty(orderPackageDOIPage.getRecords())) {
@@ -261,9 +326,6 @@ public class PackServiceImpl implements PackService {
// 查看配件列表分页
@Override
public List<OrderPartsRespVO> getPartsList(OrderPartsReqVO reqVO) {
@@ -497,7 +559,7 @@ public class PackServiceImpl implements PackService {
@Transactional(rollbackFor = Exception.class)
public void updateOrderStatus(Long orderId) {
OrderDO orderDO = productionProcessMapper.selectById(orderId);
OrderDO orderDO = ordersMapper.selectById(orderId);
if(orderDO.getFinishTime() != null){
return;
@@ -525,7 +587,7 @@ public class PackServiceImpl implements PackService {
// 修改生产单的打包状态未已打包
orderDO.setPackaged(OrderPackageStatusEnum.PACKAGED.getStatus());
productionProcessMapper.updateById(orderDO);
ordersMapper.updateById(orderDO);
}
@@ -549,7 +611,7 @@ public class PackServiceImpl implements PackService {
@Override
public PrintOrderPackRespVO printOrderPack(PrintOrderPackReqVO reqVO) {
PrintOrderPackRespVO printOrderPackRespVO = productionStatusMapper.selectOrderPack(reqVO.getOrderId(), reqVO.getPackageNo(),getUserOrganId());
PrintOrderPackRespVO printOrderPackRespVO = ordersMapper.selectOrderPack(reqVO.getOrderId(), reqVO.getPackageNo(),getUserOrganId());
printOrderPackRespVO.setPlateList(orderItemMapper.selectPrintPlateList(reqVO.getOrderId(), reqVO.getPackageNo(),getUserOrganId()));
return printOrderPackRespVO;
@@ -799,7 +861,8 @@ public class PackServiceImpl implements PackService {
if(!packageDOS.isEmpty()){
orderPackageMapper.updateDelete(reqVO.getOrderId());
// 删除除配件和其他配件外的所有包裹
orderPackageMapper.updateDelete(reqVO.getOrderId(),getUserOrganId());
}
@@ -828,6 +891,14 @@ public class PackServiceImpl implements PackService {
orderItemMapper.updateBatch(orderItemDOS);
List<OrderItemDO> orderItemDoPartsList = orderItemMapper.selectPartsList(reqVO.getOrderId(), getUserOrganId());
if(orderItemDoPartsList.isEmpty()) {
OrderDO orderDO = ordersMapper.selectById(reqVO.getOrderId());
orderDO.setPackaged(OrderPackageStatusEnum.PACKAGED.getStatus());
ordersMapper.updateById(orderDO);
}
}
@@ -1,22 +1,15 @@
package com.cf.imes.module.manage.service.patching;
import com.alibaba.nacos.shaded.com.google.gson.Gson;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.json.JsonUtils;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.module.manage.controller.admin.pack.vo.PlateDetailsRespVO;
import com.cf.imes.module.manage.controller.admin.patching.vo.*;
import com.cf.imes.module.manage.controller.admin.query.vo.productionStatus.OrderPlateRespVO;
import com.cf.imes.module.manage.dal.dataobject.patching.MachineDO;
import com.cf.imes.module.manage.dal.dataobject.patching.PatchDetailDO;
import com.cf.imes.module.manage.dal.dataobject.plate.OrderPlateDO;
import com.cf.imes.module.manage.dal.mysql.patching.MachineMapper;
import com.cf.imes.module.manage.dal.mysql.patching.PatchDetailMapper;
import com.cf.imes.module.manage.dal.mysql.plate.OrderPlateMapper;
import com.cf.imes.module.manage.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.manage.dal.mysql.process.ProductionProcessMapper;
import com.cf.imes.module.manage.util.page.PageHelperUtil;
import com.cf.imes.module.manage.dal.dataobject.patching.MachineDO;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
@@ -30,8 +23,7 @@ import java.util.List;
public class PatchingPlateServiceImpl implements PatchingPlateService{
@Resource
private ProductionProcessMapper productionProcessMapper;
@Resource
private OrderPlateMapper orderPlateMapper;
@@ -48,15 +40,7 @@ public class PatchingPlateServiceImpl implements PatchingPlateService{
@Override
public PageResult<PatchingPlateRespVO> patchingSearchPlate(PatchingPlatePageReqVO pageReqVO) {
// 查询板件和订单的基础信息
PageHelper.startPage(pageReqVO.getPageNo(), pageReqVO.getPageSize());
List<PatchingPlateRespVO> patchingPlateRespVOS = productionProcessMapper.selectPatchingPlate(pageReqVO);
//
PageInfo<PatchingPlateRespVO> pageInfo = new PageInfo<>(patchingPlateRespVOS);
return PageHelperUtil.convertToPageResult(pageInfo);
return null;
}
@@ -2,8 +2,6 @@ package com.cf.imes.module.manage.service.process;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.log.Log;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import com.cf.imes.framework.common.enums.OrderStatusEnum;
@@ -15,15 +13,14 @@ import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.module.manage.controller.admin.process.vo.*;
import com.cf.imes.module.manage.controller.admin.query.vo.productionStatus.OrderModuleVO;
import com.cf.imes.module.manage.dal.dataobject.pack.OrderBodyDO;
import com.cf.imes.module.manage.dal.dataobject.plate.OrderPlateDO;
import com.cf.imes.module.manage.dal.dataobject.plate.PlateDO;
import com.cf.imes.module.manage.dal.dataobject.process.OrderDO;
import com.cf.imes.module.manage.dal.dataobject.process.OrderProcessStepItemNDO;
import com.cf.imes.module.manage.dal.dataobject.process.OrderProcessStepNDO;
import com.cf.imes.module.manage.dal.mysql.pack.OrderBodyMapper;
import com.cf.imes.module.manage.dal.mysql.plate.OrderPlateMapper;
import com.cf.imes.module.manage.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.manage.dal.mysql.process.*;
import com.cf.imes.module.manage.dal.mysql.process.OrdersMapper;
import com.cf.imes.module.manage.dal.mysql.process.ProcessStepItemMapper;
import com.cf.imes.module.manage.dal.mysql.process.ProcessStepMapper;
import com.cf.imes.module.manage.dal.mysql.query.OrderItemMapper;
import com.cf.imes.module.system.api.process.ProcessApi;
import com.cf.imes.module.system.enums.ErrorCodeConstants;
@@ -35,7 +32,7 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.List;
import java.util.stream.Collectors;
import static com.cf.imes.framework.common.util.string.SearchUtil.insertSeparator;
@@ -73,7 +70,7 @@ public class ProductionProcessServiceImpl implements ProductionProcessService {
private OrderPlateMapper orderPlateMapper;
@Resource
private ProductionProcessMapper productionProcessMapper;
private OrdersMapper ordersMapper;
@Resource
@@ -161,10 +158,10 @@ public class ProductionProcessServiceImpl implements ProductionProcessService {
}
// 当前工序已全部加工,修改生产单的状态为生产完成
if(validateOrderStatus(processStepStatuses.getOrderId())){
OrderDO orderDO = productionProcessMapper.selectById(processStepStatuses.getOrderId());
OrderDO orderDO = ordersMapper.selectById(processStepStatuses.getOrderId());
orderDO.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus());
orderDO.setFinishTime(LocalDateTime.now());
productionProcessMapper.updateById(orderDO);
ordersMapper.updateById(orderDO);
}
return;
@@ -192,10 +189,10 @@ public class ProductionProcessServiceImpl implements ProductionProcessService {
}
// 当前工序已全部加工,修改生产单的状态为生产完成
if(validateOrderStatus(processStepStatuses.getOrderId())){
OrderDO orderDO = productionProcessMapper.selectById(processStepStatuses.getOrderId());
OrderDO orderDO = ordersMapper.selectById(processStepStatuses.getOrderId());
orderDO.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus());
orderDO.setFinishTime(LocalDateTime.now());
productionProcessMapper.updateById(orderDO);
ordersMapper.updateById(orderDO);
}
return;
@@ -211,19 +208,19 @@ public class ProductionProcessServiceImpl implements ProductionProcessService {
// 判断当前工序的状态是否为打包类型,如果是,修改生产的状态为生产完成
if(processStepStatuses.getType().equals(ProcessProcessingTypeEnum.PACK.getNumber())){
OrderDO orderDO = productionProcessMapper.selectById(processStepStatuses.getOrderId());
OrderDO orderDO = ordersMapper.selectById(processStepStatuses.getOrderId());
orderDO.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus());
orderDO.setFinishTime(LocalDateTime.now());
productionProcessMapper.updateById(orderDO);
ordersMapper.updateById(orderDO);
return;
}
// 当前工序已全部加工,修改生产单的状态为生产完成
if(validateOrderStatus(processStepStatuses.getOrderId())){
OrderDO orderDO = productionProcessMapper.selectById(processStepStatuses.getOrderId());
OrderDO orderDO = ordersMapper.selectById(processStepStatuses.getOrderId());
orderDO.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus());
orderDO.setFinishTime(LocalDateTime.now());
productionProcessMapper.updateById(orderDO);
ordersMapper.updateById(orderDO);
}
}catch (Exception e){
@@ -7,12 +7,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import com.cf.imes.framework.common.enums.OrderPackageTypeEnum;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.module.manage.controller.admin.pack.vo.GroupNameList;
import com.cf.imes.module.manage.controller.admin.pack.vo.OrderPartsReqVO;
import com.cf.imes.module.manage.controller.admin.pack.vo.PackDetailsReqVO;
import com.cf.imes.module.manage.controller.admin.pack.vo.PlateDetailsRespVO;
import com.cf.imes.module.manage.controller.admin.process.vo.ProcessRespVO;
import com.cf.imes.module.manage.controller.admin.query.vo.pack.OrderPackageVO;
import com.cf.imes.module.manage.controller.admin.query.vo.pack.PackageDetailsRespVO;
import com.cf.imes.module.manage.controller.admin.query.vo.pack.PrintOrderRespVO;
@@ -21,11 +17,12 @@ import com.cf.imes.module.manage.controller.admin.query.vo.salary.PriceRatePageR
import com.cf.imes.module.manage.controller.admin.query.vo.salary.PriceRateReqVO;
import com.cf.imes.module.manage.dal.dataobject.process.OrderDO;
import com.cf.imes.module.manage.dal.dataobject.process.OrderProcessStepNDO;
import com.cf.imes.module.manage.dal.dataobject.query.OrderPackageDO;
import com.cf.imes.module.manage.dal.mysql.pack.OrderPackageMapper;
import com.cf.imes.module.manage.dal.mysql.process.OrdersMapper;
import com.cf.imes.module.manage.dal.mysql.process.ProcessStepItemMapper;
import com.cf.imes.module.manage.dal.mysql.process.ProcessStepMapper;
import com.cf.imes.module.manage.dal.mysql.query.*;
import com.cf.imes.module.manage.dal.mysql.query.OrderItemMapper;
import com.cf.imes.module.manage.dal.mysql.query.OrderPartsMapper;
import com.cf.imes.module.manage.util.page.PageHelperUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
@@ -43,8 +40,7 @@ import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.ge
@Validated
public class ProductionStatusServiceImpl implements ProductionStatusService {
@Resource
private ProductionStatusMapper productionStatusMapper;
@Resource
private ProcessStepMapper processStepMapper;
@@ -56,6 +52,8 @@ public class ProductionStatusServiceImpl implements ProductionStatusService {
@Resource
private OrderPackageMapper orderPackageMapper;
@Resource
private OrdersMapper ordersMapper;
@Resource
private OrderItemMapper orderItemMapper;
@@ -69,7 +67,7 @@ public class ProductionStatusServiceImpl implements ProductionStatusService {
@Override
public PageResult<OrderDO> getProductionPage(OrderPlatePageReqVO pageReqVO) {
return productionStatusMapper.selectProductionPage(pageReqVO);
return ordersMapper.selectProductionPage(pageReqVO);
}
@@ -156,7 +154,7 @@ public class ProductionStatusServiceImpl implements ProductionStatusService {
@Override
public PageResult<OrderDO> queryPackage(OrderPlatePageReqVO pageReqVO) {
return productionStatusMapper.selectProductionPage(pageReqVO);
return ordersMapper.selectProductionPage(pageReqVO);
}
@@ -235,7 +233,9 @@ public class ProductionStatusServiceImpl implements ProductionStatusService {
@Override
public PrintOrderRespVO printOrder(Long orderNo) {
return productionStatusMapper.selectPrintOrder(orderNo,getUserOrganId());
// return productionStatusMapper.selectPrintOrder(orderNo,getUserOrganId());
return null;
}
@@ -15,42 +15,69 @@
resultMap="PackMap">
select
op.order_id as id,
count(distinct op.id) as packCount
from order_package op
join order_item oi on op.id = oi.package_id and op.organ_id = oi.organ_id
select
order_id as id,
count(id) as packCount
from order_package
where
oi.package_id != 0
and op.organ_id = #{organId}
and op.order_id in
organ_id = #{organId}
and status !=0
and deleted = false
and order_id in
<foreach item="id" collection="orderIds" open="(" separator="," close=")">
#{id}
</foreach>
group by op.order_id;
group by order_id
</select>
<!-- select-->
<!-- op.order_id as id,-->
<!-- count(distinct op.id) as packCount-->
<!-- from order_package op-->
<!-- join order_item oi on op.id = oi.package_id and op.organ_id = oi.organ_id-->
<!-- where-->
<!-- oi.package_id != 0-->
<!-- and op.organ_id = #{organId}-->
<!-- and op.order_id in-->
<!-- <foreach item="id" collection="orderIds" open="(" separator="," close=")">-->
<!-- #{id}-->
<!-- </foreach>-->
<!-- group by op.order_id;-->
<select id="selectPackPieceCount"
parameterType="java.util.List"
resultMap="PackMap">
select
op.order_id as id,
count(distinct oi.plate_id ) as packPieceCount
select distinct
from order_package op
join order_item oi on op.id = oi.package_id and op.organ_id = oi.organ_id
op.order_id as id,
count(distinct oi.plate_id ) as packPieceCount
where oi.package_id !=0
from order_item oi
join order_package op on oi.package_id = op.id and oi.organ_id = op.organ_id
where
oi.organ_id = #{organId}
and oi.order_id in
<foreach item="id" collection="orderIds" open="(" separator="," close=")">
#{id}
</foreach>
and op.status != 0
and oi.package_id !=0
and oi.plate_id != 0
and op.organ_id =#{organId}
and op.order_id in
<foreach item="id" collection="orderIds" open="(" separator="," close=")">
#{id}
</foreach>
group by op.order_id;
@@ -133,55 +160,60 @@
<select id="selectByOrderNo"
resultType="com.cf.imes.module.manage.controller.admin.query.vo.pack.OrderPackageVO"
parameterType="map">
resultType="com.cf.imes.module.manage.controller.admin.query.vo.pack.OrderPackageVO">
select distinct
opn.id,
opn.order_id,
opn.package_no,
opn.type,
opn.status,
opn.organ_id,
opn.creator,
opn.remark as packRemark,
opn.updater,
opn.update_time,
opn.create_time,
op.id,
op.order_id,
op.package_no,
op.type,
op.status,
op.organ_id,
op.creator,
op.remark as packRemark,
op.updater,
op.update_time,
op.create_time,
o.custom_order_no,
o.dealer,
o.customer,
o.address,
o.remark as orderRemark
from order_package opn
join orders o on opn.order_id = o.id and opn.organ_id = o.organ_id
join order_item oi on opn.id = oi.package_id and opn.organ_id = oi.organ_id
left join order_plate op on oi.plate_id = op.id and oi.organ_id = op.organ_id
<where>
<if test="reqVO.orderId !=null">
and opn.order_id = #{reqVO.orderId}
</if>
<if test="reqVO.plateNo !=null ">
and op.plate_no like concat('%', #{reqVO.plateNo},'%')
</if>
<if test="reqVO.packStatus !=null ">
and opn.status= #{reqVO.packStatus}
</if>
<if test="reqVO.packageNo !=null and reqVO.packageNo != '' ">
and opn.package_no like concat('%', #{reqVO.packageNo},'%')
</if>
and opn.organ_id = #{organId}
</where>
from orders o
left join order_package op on o.id = op.order_id and o.organ_id = op.organ_id
${ew.customSqlSegment}
</select>
<!-- <where>
o.organ_id = #{organId}
<if test="reqVO.orderId !=null">
and o.id = #{reqVO.orderId}
</if>
<if test="packId !=null">
and op.id in
<foreach item="packId" collection="packId" open="(" separator="," close=")">
#{packId}
</foreach>
</if>
<if test="reqVO.packStatus !=null ">
and op.status= #{reqVO.packStatus}
</if>
<if test="reqVO.packageNo !=null and reqVO.packageNo != '' ">
and op.package_no like concat('%', #{reqVO.packageNo},'%')
</if>
</where>-->
<select id="selectOrderPack"
resultType="com.cf.imes.module.manage.controller.admin.pack.vo.PlateAndPartIdList">
@@ -197,5 +229,28 @@
</select>
<select id="selectPackListByOrderId"
resultType="com.cf.imes.module.manage.controller.admin.query.vo.pack.OrderPackageVO">
select distinct
id,
order_id,
package_no,
type,
status,
organ_id,
creator,
remark as packRemark,
updater,
update_time,
create_time
from order_package
where organ_id = #{organId} and order_id = #{orderId} and deleted = false
</select>
</mapper>
@@ -1,40 +1,64 @@
<?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.manage.dal.mysql.query.ProductionStatusMapper">
<mapper namespace="com.cf.imes.module.manage.dal.mysql.process.OrdersMapper">
<resultMap id="printOrderMap" type="com.cf.imes.module.manage.controller.admin.query.vo.pack.PrintOrderRespVO">
<result property="orderNo" column="orderNo"/>
<result property="customOrderNo" column="customOrderNo"/>
<result property="dealer" column="dealer"/>
<result property="address" column="address"/>
<result property="customer" column="customer"/>
<result property="customerPhone" column="customerPhone"/>
<result property="packageQuantity" column="packageQuantity"/>
</resultMap>
<select id="selectPrintOrder"
parameterType="java.lang.Long"
resultMap="printOrderMap">
<select id="selectOrderIds" resultMap="PackMap">
select
o.id as orderNo ,
o.custom_order_no as customOrderNo,
o.dealer as dealer,
o.address as address,
o.customer as customer,
o.phone_number as customerPhone,
count(opn.order_id) as packageQuantity
from `orders` o
join order_package opn on o.id = opn.order_id and o.organ_id = opn.organ_id
SELECT
id as orderNo,
custom_order_no as customOrderNo,
dealer as dealer,
dealer_phone_number as dealerPhoneNumber,
order_date as orderDate,
create_time as createTime,
delivery_date as deliveryDate,
customer as customer,
phone_number as phoneNumber,
address as address,
salesman as salesman,
splitter as splitter,
packaged as packaged
FROM orders
WHERE organ_id = #{organId} and deleted = false and status != 0 and create_time &gt;= #{createTime} and id != #{orderId}
ORDER BY create_time
LIMIT 1 ;
where o.id = #{orderNo} and opn.status &lt;&gt; 0 and o.organ_id = #{organId} ;
</select>
<select id="selectOrderIdsFalse" resultMap="PackMap">
SELECT
id as orderNo,
custom_order_no as customOrderNo,
dealer as dealer,
dealer_phone_number as dealerPhoneNumber,
order_date as orderDate,
create_time as createTime,
delivery_date as deliveryDate,
customer as customer,
phone_number as phoneNumber,
address as address,
salesman as salesman,
splitter as splitter,
packaged as packaged
FROM orders
WHERE organ_id = #{organId} and deleted = false and status != 0 and create_time &lt;= #{createTime} and id != #{orderId}
ORDER BY create_time desc
LIMIT 1 ;
</select>
<resultMap id="PackMap" type="com.cf.imes.module.manage.controller.admin.pack.vo.PackRespVO">
<result property="id" column="orderNo"/>
@@ -82,11 +106,11 @@
join order_item oi on o.id = oi.order_id and o.organ_id = oi.organ_id
WHERE
o.organ_id = #{organId} and
o.id in
<foreach item="id" collection="orderIds" open="(" separator="," close=")">
#{id}
</foreach>
o.organ_id = #{organId} and
o.id in
<foreach item="id" collection="orderIds" open="(" separator="," close=")">
#{id}
</foreach>
group by orderNo,customOrderNo,dealer,deliveryDate,customer,phoneNumber,address,salesman,splitter,packaged,dealerPhoneNumber,orderDate,o.create_time
@@ -110,14 +134,14 @@
resultMap="PrintMap">
select o.custom_order_no as customOrderNo,
o.dealer as dealer,
opn.id as packNo ,
o.id as orderNo,
o.address as address,
((SELECT COUNT(t2.id) FROM order_package t2 WHERE t2.create_time &lt;= opn.create_time and t2.order_id =#{orderNo})) as packNum
o.dealer as dealer,
opn.id as packNo ,
o.id as orderNo,
o.address as address,
((SELECT COUNT(t2.id) FROM order_package t2 WHERE t2.create_time &lt;= opn.create_time and t2.order_id =#{orderNo})) as packNum
from `orders` o
join order_package opn on o.id = opn.order_id and o.organ_id = opn.organ_id
join order_package opn on o.id = opn.order_id and o.organ_id = opn.organ_id
where opn.order_id =#{orderNo} and opn.id = #{packageNo} and opn.status &lt;&gt; 0 and opn.organ_id = #{organId}
order by opn.create_time ;
@@ -125,10 +149,25 @@
</select>
<select id="selectOrderIds" resultType="com.cf.imes.module.manage.dal.dataobject.process.OrderDO" parameterType="map">
<select id="selectOrderIdList" resultMap="PackMap" parameterType="map">
select * from orders
select
id as orderNo,
custom_order_no as customOrderNo,
dealer as dealer,
dealer_phone_number as dealerPhoneNumber,
order_date as orderDate,
create_time as createTime,
delivery_date as deliveryDate,
customer as customer,
phone_number as phoneNumber,
address as address,
salesman as salesman,
splitter as splitter,
packaged as packaged
from orders
<where>
organ_id =#{organId}
@@ -165,7 +204,9 @@
</select>
<!-- <if test="pageReqVO.status == true">
and status in (4)
</if>-->
</mapper>
@@ -1,194 +0,0 @@
<?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.manage.dal.mysql.process.ProductionProcessMapper">
<resultMap id="PatchingPlateMap" type="com.cf.imes.module.manage.controller.admin.patching.vo.PatchingPlateRespVO">
<result property="groupId" column="groupId"/>
<result property="orderId" column="orderId"/>
<result property="customOrderId" column="customOrderId"/>
<result property="customer" column="customer"/>
<result property="address" column="address"/>
<result property="orderStatus" column="orderStatus"/>
<result property="plateName" column="plateName"/>
<result property="plateNum" column="plateNum"/>
<result property="thickness" column="thickness"/>
<result property="material" column="material"/>
<result property="color" column="color"/>
</resultMap>
<select id="selectPatchingPlate"
resultMap="PatchingPlateMap"
parameterType="com.cf.imes.module.manage.controller.admin.patching.vo.PatchingPlatePageReqVO">
select
DISTINCT
p.goods_id,
o.id as orderId,
o.custom_order_no as customOrderId,
o.customer as customer,
o.address as address,
o.status as orderStatus,
oi.num as plateNum,
<![CDATA[
CONCAT(
TRIM(TRAILING '.' from TRIM(TRAILING '0' FROM p.thickness)),'mm-',p.material,'-',p.color) AS plateName,
]]>
p.thickness as thickness,
p.material as material,
p.color as color
from `orders` o
join order_item oi on o.id = oi.order_id
join order_plate op on oi.plate_id = op.id
join plate p on op.goods_id = p.goods_id
<where>
<choose>
<!-- 挖穿,挖孔,二维刀路判断 -->
<when test="isDigThrough == true">
(op.filter_type = 1
<if test="isDiggingHoles == true ">
or op.filter_type = 2
</if>
<if test="is2DCuttingPath == true ">
or op.filter_type = 4
</if>)
<!-- 其他的判断 -->
<if test="orderNo != null">
and o.id = #{orderNo}
</if>
<if test="customOrderNo != null">
and o.custom_order_no = #{customOrderNo}
</if>
<if test="customer != null">
and o.customer = #{customer}
</if>
<if test="address != null">
and o.address = #{address}
</if>
<if test="statusList != null">
and o.status in
<foreach item="id" collection="statusList" open="(" separator="," close=")">
#{id}
</foreach>
</if>
<if test="startTime != null and endTime != null">
and o.update_time between #{startTime} and #{endTime}
</if>
<if test="isRectangle == true ">
and op.unregular_point_count = 0
</if>
<if test="isSpecialShaped == true ">
and op.unregular_point_count &gt; 0
</if>
<if test="isProfiling == true ">
and front_model_count &gt; 0 or op.back_hole_count &gt; 0 or op.side_hole_count &gt; 0
</if>
<if test="isDoor == true ">
and op.is_door = 1
</if>
<!-- <if test="longRangeList != null and !longRangeList.isEmpty()">
AND (
&lt;!&ndash; 根据 DataRangeList 中的属性进行条件判断 &ndash;&gt;
<foreach collection="longRangeList" item="range" separator=" OR ">
(#{op.width} &lt;= #{range.maxaa} AND #{op.width} &gt;= #{range.minbb})
</foreach>
)
</if>-->
</when>
<!-- 不传入挖穿等判断,走另一个判断逻辑 -->
<otherwise>
<if test="orderNo != null">
and o.id = #{orderNo}
</if>
<if test="customOrderNo != null">
and o.custom_order_no = #{customOrderNo}
</if>
<if test="customer != null">
and o.customer = #{customer}
</if>
<if test="address != null">
and o.address = #{address}
</if>
<if test="statusList != null">
and o.status in
<foreach item="id" collection="statusList" open="(" separator="," close=")">
#{id}
</foreach>
</if>
<if test="startTime != null and endTime != null">
and o.update_time between #{startTime} and #{endTime}
</if>
<if test="isRectangle == true ">
and op.unregular_point_count = 0
</if>
<if test="isSpecialShaped == true ">
and op.unregular_point_count &gt; 0
</if>
<if test="isProfiling == true ">
and front_model_count &gt; 0 or op.back_hole_count &gt; 0 or op.side_hole_count &gt; 0
</if>
<if test="isDoor == true ">
and op.is_door = 1
</if>
<!--
<if test="longRangeList != null and !longRangeList.isEmpty()">
AND
&lt;!&ndash; 根据 DataRangeList 中的属性进行条件判断 &ndash;&gt;
<foreach collection="longRangeList" item="range" open="(" separator="," close=")">
op.width between #{range.minbb} AND #{range.maxaa}
</foreach>
</if>-->
</otherwise>
</choose>
</where>
group by p.goods_id,orderId,customOrderId,customer,address,orderStatus,plateNum,plateName,thickness,material,color
</select>
<select id="selectOrderIds" resultType="com.cf.imes.module.manage.dal.dataobject.process.OrderDO">
SELECT * FROM orders
WHERE organ_id = #{organId} and deleted = false and status != 0 and create_time &gt; #{createTime} and id != #{orderId}
ORDER BY create_time
LIMIT 1 ;
</select>
<select id="selectOrderIdsFalse" resultType="com.cf.imes.module.manage.dal.dataobject.process.OrderDO">
SELECT * FROM orders
WHERE organ_id = #{organId} and deleted = false and status != 0 and create_time &lt; #{createTime} and id != #{orderId}
ORDER BY create_time desc
LIMIT 1 ;
</select>
</mapper>

Some files were not shown because too many files have changed in this diff Show More