退料定时任务
This commit is contained in:
parent
c9ad9a1377
commit
2d68d8d410
|
|
@ -6,6 +6,7 @@ import com.bonus.common.security.annotation.EnableCustomConfig;
|
||||||
import com.bonus.common.security.annotation.EnableRyFeignClients;
|
import com.bonus.common.security.annotation.EnableRyFeignClients;
|
||||||
import com.bonus.common.swagger.annotation.EnableCustomSwagger2;
|
import com.bonus.common.swagger.annotation.EnableCustomSwagger2;
|
||||||
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 系统模块
|
* 系统模块
|
||||||
|
|
@ -16,6 +17,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||||
@EnableCustomSwagger2
|
@EnableCustomSwagger2
|
||||||
@EnableRyFeignClients
|
@EnableRyFeignClients
|
||||||
@SpringBootApplication(scanBasePackages = {"com.bonus.common.biz.*", "com.bonus.material.*"}, exclude = { DataSourceAutoConfiguration.class })
|
@SpringBootApplication(scanBasePackages = {"com.bonus.common.biz.*", "com.bonus.material.*"}, exclude = { DataSourceAutoConfiguration.class })
|
||||||
|
@EnableScheduling
|
||||||
public class BonusMaterialApplication
|
public class BonusMaterialApplication
|
||||||
{
|
{
|
||||||
public static void main(String[] args)
|
public static void main(String[] args)
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import java.math.BigDecimal;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.bonus.material.archives.domain.ElcSignatureInfo;
|
||||||
import com.bonus.material.basic.domain.BmFileInfo;
|
import com.bonus.material.basic.domain.BmFileInfo;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import com.bonus.common.core.annotation.Excel;
|
import com.bonus.common.core.annotation.Excel;
|
||||||
|
|
@ -34,6 +35,17 @@ public class PurchaseCheckDetails extends BaseEntity {
|
||||||
@ApiModelProperty(value = "任务ID")
|
@ApiModelProperty(value = "任务ID")
|
||||||
private Long taskId;
|
private Long taskId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "验收人ID")
|
||||||
|
private Long checkUser;
|
||||||
|
|
||||||
|
/** 验收人信息 */
|
||||||
|
@ApiModelProperty(value = "验收人信息")
|
||||||
|
private List<ElcSignatureInfo> infoList;
|
||||||
|
|
||||||
|
private String signUrl;
|
||||||
|
|
||||||
|
private String signType;
|
||||||
|
|
||||||
/** 规格id */
|
/** 规格id */
|
||||||
//@Excel(name = "规格id")
|
//@Excel(name = "规格id")
|
||||||
@ApiModelProperty(value = "规格id")
|
@ApiModelProperty(value = "规格id")
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package com.bonus.material.purchase.domain.vo;
|
package com.bonus.material.purchase.domain.vo;
|
||||||
|
|
||||||
|
import com.bonus.material.archives.domain.ElcSignatureInfo;
|
||||||
import com.bonus.material.purchase.domain.PurchaseCheckDetails;
|
import com.bonus.material.purchase.domain.PurchaseCheckDetails;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
@ -39,4 +40,13 @@ public class PurchaseCheckFormVo {
|
||||||
@ApiModelProperty("物资列表")
|
@ApiModelProperty("物资列表")
|
||||||
private List<PurchaseCheckDetails> materialList = new ArrayList<>();
|
private List<PurchaseCheckDetails> materialList = new ArrayList<>();
|
||||||
|
|
||||||
|
/** 验收人信息 */
|
||||||
|
@ApiModelProperty(value = "验收人信息")
|
||||||
|
private List<ElcSignatureInfo> infoList;
|
||||||
|
|
||||||
|
private String signUrl;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "签名类型 手写0 和 图片上传1")
|
||||||
|
private String signType;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -100,7 +100,7 @@ public class PurchaseCheckInfoServiceImpl implements IPurchaseCheckInfoService {
|
||||||
break;
|
break;
|
||||||
case PURCHASE_TASK_STAGE_CHECK:
|
case PURCHASE_TASK_STAGE_CHECK:
|
||||||
purchaseCheckDetailsList = purchaseCheckDetailsList.stream().filter(o -> !PurchaseTaskStatusEnum.TO_NOTICE.getStatus().equals(o.getStatus())).collect(Collectors.toList());
|
purchaseCheckDetailsList = purchaseCheckDetailsList.stream().filter(o -> !PurchaseTaskStatusEnum.TO_NOTICE.getStatus().equals(o.getStatus())).collect(Collectors.toList());
|
||||||
purchaseCheckDetailsList = purchaseCheckDetailsList.stream().filter(o -> !PurchaseTaskStatusEnum.TO_CHECK_AFTER_REJECT.getStatus().equals(o.getStatus())).collect(Collectors.toList());
|
//purchaseCheckDetailsList = purchaseCheckDetailsList.stream().filter(o -> !PurchaseTaskStatusEnum.TO_CHECK_AFTER_REJECT.getStatus().equals(o.getStatus())).collect(Collectors.toList());
|
||||||
break;
|
break;
|
||||||
case PURCHASE_TASK_STAGE_BIND:
|
case PURCHASE_TASK_STAGE_BIND:
|
||||||
purchaseCheckDetailsList = purchaseCheckDetailsList.stream().filter(o ->
|
purchaseCheckDetailsList = purchaseCheckDetailsList.stream().filter(o ->
|
||||||
|
|
@ -411,12 +411,14 @@ public class PurchaseCheckInfoServiceImpl implements IPurchaseCheckInfoService {
|
||||||
if (!CollectionUtils.isEmpty(codeList)) {
|
if (!CollectionUtils.isEmpty(codeList)) {
|
||||||
for (PurchaseCheckDetails details : codeList) {
|
for (PurchaseCheckDetails details : codeList) {
|
||||||
details.setStatus(PurchaseTaskStatusEnum.TO_BIND.getStatus());
|
details.setStatus(PurchaseTaskStatusEnum.TO_BIND.getStatus());
|
||||||
|
details.setCheckUser(SecurityUtils.getUserId());
|
||||||
updateCount += purchaseCheckDetailsMapper.updatePurchaseDetails4Check(details);
|
updateCount += purchaseCheckDetailsMapper.updatePurchaseDetails4Check(details);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!CollectionUtils.isEmpty(numList)) {
|
if (!CollectionUtils.isEmpty(numList)) {
|
||||||
for (PurchaseCheckDetails details : numList) {
|
for (PurchaseCheckDetails details : numList) {
|
||||||
details.setStatus(PurchaseTaskStatusEnum.TO_STORE.getStatus());
|
details.setStatus(PurchaseTaskStatusEnum.TO_STORE.getStatus());
|
||||||
|
details.setCheckUser(SecurityUtils.getUserId());
|
||||||
updateCount += purchaseCheckDetailsMapper.updatePurchaseDetails4Check(details);
|
updateCount += purchaseCheckDetailsMapper.updatePurchaseDetails4Check(details);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -441,6 +443,7 @@ public class PurchaseCheckInfoServiceImpl implements IPurchaseCheckInfoService {
|
||||||
} else if (MaTypeManageTypeEnum.NUMBER_DEVICE.getTypeId().equals(details.getManageType())) {
|
} else if (MaTypeManageTypeEnum.NUMBER_DEVICE.getTypeId().equals(details.getManageType())) {
|
||||||
details.setStatus(PurchaseTaskStatusEnum.TO_STORE.getStatus());
|
details.setStatus(PurchaseTaskStatusEnum.TO_STORE.getStatus());
|
||||||
}
|
}
|
||||||
|
details.setCheckUser(SecurityUtils.getUserId());
|
||||||
result = purchaseCheckDetailsMapper.updatePurchaseDetails4Check(details) > 0 ? AjaxResult.success("detail验证成功") : AjaxResult.error("details无验证信息");
|
result = purchaseCheckDetailsMapper.updatePurchaseDetails4Check(details) > 0 ? AjaxResult.success("detail验证成功") : AjaxResult.error("details无验证信息");
|
||||||
extractedFile(details);
|
extractedFile(details);
|
||||||
}
|
}
|
||||||
|
|
@ -449,10 +452,10 @@ public class PurchaseCheckInfoServiceImpl implements IPurchaseCheckInfoService {
|
||||||
for (PurchaseCheckDetails details : purchaseVerifyVo.getPurchaseCheckDetailsList()) {
|
for (PurchaseCheckDetails details : purchaseVerifyVo.getPurchaseCheckDetailsList()) {
|
||||||
details.setStatus(PurchaseTaskStatusEnum.TO_CHECK_AFTER_REJECT.getStatus());
|
details.setStatus(PurchaseTaskStatusEnum.TO_CHECK_AFTER_REJECT.getStatus());
|
||||||
result = 0 < purchaseCheckDetailsMapper.updatePurchaseDetails4Check(details) ? AjaxResult.success("detail验证驳回成功") : AjaxResult.error("details无验证信息");
|
result = 0 < purchaseCheckDetailsMapper.updatePurchaseDetails4Check(details) ? AjaxResult.success("detail验证驳回成功") : AjaxResult.error("details无验证信息");
|
||||||
tmTaskMapper.updateTmTask(new TmTask()
|
/*tmTaskMapper.updateTmTask(new TmTask()
|
||||||
.setTaskId(details.getTaskId())
|
.setTaskId(details.getTaskId())
|
||||||
.setTaskType(TmTaskTypeEnum.TM_TASK_PURCHASE.getTaskTypeId())
|
.setTaskType(TmTaskTypeEnum.TM_TASK_PURCHASE.getTaskTypeId())
|
||||||
.setTaskStatus(PurchaseTaskStatusEnum.TASK_IN_PROGRESS.getStatus()));
|
.setTaskStatus(PurchaseTaskStatusEnum.TASK_IN_PROGRESS.getStatus()));*/
|
||||||
extractedFile(details);
|
extractedFile(details);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -490,8 +493,16 @@ public class PurchaseCheckInfoServiceImpl implements IPurchaseCheckInfoService {
|
||||||
public PurchaseCheckFormVo selectPurchaseCheckFormVoByTaskId(Long taskId) {
|
public PurchaseCheckFormVo selectPurchaseCheckFormVoByTaskId(Long taskId) {
|
||||||
// 执行SQL查询外层信息
|
// 执行SQL查询外层信息
|
||||||
final PurchaseCheckFormVo result = purchaseCheckInfoMapper.selectPurchaseCheckFormVoByTaskId(taskId);
|
final PurchaseCheckFormVo result = purchaseCheckInfoMapper.selectPurchaseCheckFormVoByTaskId(taskId);
|
||||||
|
|
||||||
if (null != result) {
|
if (null != result) {
|
||||||
|
PurchaseCheckInfo purchaseCheckInfo = new PurchaseCheckInfo();
|
||||||
|
purchaseCheckInfo.setTaskId(taskId);
|
||||||
|
List<PurchaseCheckDetails> list = purchaseCheckDetailsMapper.selectPurchaseCheckDetailsListFromInfo(purchaseCheckInfo);
|
||||||
|
if (!CollectionUtils.isEmpty(list)) {
|
||||||
|
for (PurchaseCheckDetails purchaseCheckDetails : list) {
|
||||||
|
result.setSignUrl(purchaseCheckDetails.getSignUrl() != null ? purchaseCheckDetails.getSignUrl() : "");
|
||||||
|
result.setSignType(purchaseCheckDetails.getSignType() != null ? purchaseCheckDetails.getSignType() : "");
|
||||||
|
}
|
||||||
|
}
|
||||||
// 执行SQL查询内层信息
|
// 执行SQL查询内层信息
|
||||||
final List<PurchaseCheckDetails> purchaseCheckDetails = purchaseCheckDetailsMapper.selectPurchaseCheckDetailsListByTaskId(taskId, null, SecurityUtils.getUserId());
|
final List<PurchaseCheckDetails> purchaseCheckDetails = purchaseCheckDetailsMapper.selectPurchaseCheckDetailsListByTaskId(taskId, null, SecurityUtils.getUserId());
|
||||||
// 过滤掉空数据
|
// 过滤掉空数据
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
package com.bonus.material.warning;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.scheduling.TaskScheduler;
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
||||||
|
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author ma_sh
|
||||||
|
* @create 2025/1/10 12:00
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
@EnableScheduling
|
||||||
|
public class ScheduledConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ScheduledTaskRegistrar scheduledTaskRegistrar(TaskScheduler taskScheduler) {
|
||||||
|
ScheduledTaskRegistrar registrar = new ScheduledTaskRegistrar();
|
||||||
|
registrar.setTaskScheduler(taskScheduler);
|
||||||
|
return registrar;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public TaskScheduler taskScheduler() {
|
||||||
|
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
|
||||||
|
scheduler.setPoolSize(10);
|
||||||
|
scheduler.setThreadNamePrefix("ScheduledTask-");
|
||||||
|
return scheduler;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,113 @@
|
||||||
|
package com.bonus.material.warning;
|
||||||
|
|
||||||
|
import com.alibaba.nacos.common.utils.CollectionUtils;
|
||||||
|
import com.bonus.common.core.utils.StringUtils;
|
||||||
|
import com.bonus.common.core.utils.sms.SmsUtils;
|
||||||
|
import com.bonus.material.back.domain.BackApplyInfo;
|
||||||
|
import com.bonus.material.back.service.IBackApplyInfoService;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
|
||||||
|
import org.springframework.scheduling.support.CronTrigger;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务定时推送相关人员任务控制器
|
||||||
|
* @author ma_sh
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
public class ScheduledTasks {
|
||||||
|
|
||||||
|
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IBackApplyInfoService backApplyInfoService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ScheduledTaskRegistrar scheduledTaskRegistrar;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定时任务执行频率,每3天上午9点执行一次
|
||||||
|
*/
|
||||||
|
private String cronExpression = "0 0 9 */3 * ?";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化定时任务
|
||||||
|
*/
|
||||||
|
@PostConstruct
|
||||||
|
public void init() {
|
||||||
|
cronExpression = getCronFromDatabase();
|
||||||
|
updateCronTask();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新定时任务
|
||||||
|
*/
|
||||||
|
private void updateCronTask() {
|
||||||
|
scheduledTaskRegistrar.getScheduler().schedule(() -> {
|
||||||
|
taskWithFixedRate();
|
||||||
|
}, new CronTrigger(cronExpression));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从数据库中获取 cron 表达式
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String getCronFromDatabase() {
|
||||||
|
// 这里假设从数据库中获取 cron 表达式
|
||||||
|
return "0 0 9 */2 * ?";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退料人未签字三天推送一次给李勇
|
||||||
|
* 每三天的上午9点执行
|
||||||
|
*/
|
||||||
|
public void taskWithFixedRate() {
|
||||||
|
log.info("开始执行退料人未签字任务");
|
||||||
|
BackApplyInfo info = new BackApplyInfo();
|
||||||
|
info.setIsExport(false);
|
||||||
|
List<BackApplyInfo> list = backApplyInfoService.selectBackApplyInfoList(info);
|
||||||
|
// 用于标记是否有 BackSignUrl 为 null 的记录
|
||||||
|
boolean hasNullBackSignUrl = false;
|
||||||
|
if (CollectionUtils.isNotEmpty(list)) {
|
||||||
|
// 遍历列表,检查每个 BackApplyInfo 的 BackSignUrl 是否为空
|
||||||
|
for (BackApplyInfo backApplyInfo : list) {
|
||||||
|
if (StringUtils.isBlank(backApplyInfo.getBackSignUrl())) {
|
||||||
|
hasNullBackSignUrl = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasNullBackSignUrl) {
|
||||||
|
// 统一发送一条短信
|
||||||
|
String phoneNumber = "15527030643";
|
||||||
|
String content = "您好,李勇!您还有退料单未签字,请及时登录系统查看处理,感谢配合!";
|
||||||
|
// 发送短信
|
||||||
|
try {
|
||||||
|
String sendResult = SmsUtils.smsToken(phoneNumber, content, "");
|
||||||
|
if (sendResult != null && !sendResult.isEmpty()) {
|
||||||
|
log.info("短信发送成功: {}", sendResult);
|
||||||
|
System.out.println("短信发送成功: " + sendResult);
|
||||||
|
} else {
|
||||||
|
log.error("短信发送失败,发送结果为空!");
|
||||||
|
System.out.println("短信发送失败,发送结果为空!");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("短信发送过程中发生异常: {}", e.getMessage());
|
||||||
|
System.out.println("短信发送过程中发生异常: " + e.getMessage());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.info("没有未签字的退料单");
|
||||||
|
System.out.println("没有未签字的退料单");
|
||||||
|
}
|
||||||
|
// 记录任务执行时间
|
||||||
|
System.out.println("退料人未签字任务执行时间:" + LocalDateTime.now().format(FORMATTER));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -49,10 +49,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
pcd.supplier_id, pcd.status, pcd.create_by, pcd.production_time, pcd.create_time, pcd.update_by, pcd.update_time,
|
pcd.supplier_id, pcd.status, pcd.create_by, pcd.production_time, pcd.create_time, pcd.update_by, pcd.update_time,
|
||||||
pcd.remark, pcd.check_url_name, pcd.check_url, pcd.input_num, pcd.input_status, pcd.input_time, pcd.file_name,
|
pcd.remark, pcd.check_url_name, pcd.check_url, pcd.input_num, pcd.input_status, pcd.input_time, pcd.file_name,
|
||||||
pcd.file_url, pcd.company_id, pcd.fix_code, mt.type_name, mt.unit_name, mt.unit_value,mtp.type_name as ma_type_name, mt.manage_type as manage_type,
|
pcd.file_url, pcd.company_id, pcd.fix_code, mt.type_name, mt.unit_name, mt.unit_value,mtp.type_name as ma_type_name, mt.manage_type as manage_type,
|
||||||
pcd.warn_documents as warnDocuments, pcd.reason as reason, mt.rent_price as rentPrice
|
pcd.warn_documents as warnDocuments, pcd.reason as reason, mt.rent_price as rentPrice, su.sign_url as signUrl, su.sign_type as signType
|
||||||
from purchase_check_details pcd
|
from purchase_check_details pcd
|
||||||
left join ma_type mt on pcd.type_id = mt.type_id
|
left join ma_type mt on pcd.type_id = mt.type_id
|
||||||
left join ma_type mtp on mt.parent_id = mtp.type_id
|
left join ma_type mtp on mt.parent_id = mtp.type_id
|
||||||
|
left join sys_user su on pcd.check_user = su.user_id
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
<select id="selectPurchaseCheckDetailsList" parameterType="com.bonus.material.purchase.domain.PurchaseCheckDetails" resultMap="PurchaseCheckDetailsResult">
|
<select id="selectPurchaseCheckDetailsList" parameterType="com.bonus.material.purchase.domain.PurchaseCheckDetails" resultMap="PurchaseCheckDetailsResult">
|
||||||
|
|
@ -346,7 +347,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
warn_documents = #{warnDocuments},
|
warn_documents = #{warnDocuments},
|
||||||
</if>
|
</if>
|
||||||
<if test="reason != null and reason != ''">
|
<if test="reason != null and reason != ''">
|
||||||
reason = #{reason}
|
reason = #{reason},
|
||||||
|
</if>
|
||||||
|
<if test="checkUser != null">
|
||||||
|
check_user = #{checkUser}
|
||||||
</if>
|
</if>
|
||||||
</set>
|
</set>
|
||||||
<where>
|
<where>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue