添加工单接受提醒与工单未完结提醒

This commit is contained in:
DB 2024-02-04 14:41:37 +08:00
parent 00be6f52ab
commit 6b5935f880
22 changed files with 477 additions and 107 deletions

View File

@ -65,7 +65,7 @@ public class EasyLearnUnionPayBo {
* 订单类型
*/
@NotNull(message = "联合支付类型不能为空")
@ApiModelProperty(value = "联合支付类型(PREPAYMENT:预付;REPAYMENT:还款;MEMBER:会员)",required = true)
@ApiModelProperty(value = "联合支付类型(WX_PAY:微信支付;PREPAYMENT:预付;REPAYMENT:还款;MEMBER:会员)",required = true)
private String easyLearnUnionPay;
/**
@ -87,5 +87,11 @@ public class EasyLearnUnionPayBo {
@ApiModelProperty("订单内容(课卡名/商品名)")
private String orderContent;
/**
* 顾问
*/
@ApiModelProperty("顾问")
private String counselor;
}

View File

@ -1,15 +1,9 @@
package com.cpop.jambox.business.controller.backstage;
import com.alibaba.excel.EasyExcel;
import com.cpop.core.base.R;
import com.cpop.jambox.business.bo.EasyLearnPageBo;
import com.cpop.jambox.business.bo.EasyLearnUnifiedPayBo;
import com.cpop.jambox.business.bo.EasyLearnUnionPayBo;
import com.cpop.jambox.business.bo.OncePlaceOrderBo;
import com.cpop.jambox.business.dto.EasyLearnPageDto;
import com.cpop.jambox.business.service.EasyLearnOrderService;
import com.cpop.jambox.business.vo.EasyLearnPageVo;
import com.mybatisflex.core.paginate.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
@ -17,10 +11,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
/**
* 果酱-放心学订单表 控制层
*

View File

@ -583,7 +583,7 @@ public class EasyLearnOrderServiceImpl extends ServiceImpl<EasyLearnOrderMapper,
orderRequest.setSpbillCreateIp(IpUtils.getHostIp())
.setOpenid(bo.getOpenId())
//商品描述
.setBody("一次性支付")
.setBody("联合支付")
.setOutTradeNo(easyLearnOrder.getId())
//元转分
.setTotalFee(easyLearnOrder.getTotalAmount().scaleByPowerOfTen(2).intValue())

View File

@ -1,5 +1,6 @@
package com.cpop.mall.web;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSONObject;
import com.cpop.core.utils.uuid.IdUtils;
import com.cpop.pay.framewok.config.wxPay.WxPayProperties;
@ -51,18 +52,18 @@ public class CpopWxPayTests {
WxPayRefundV3Request.Amount amount = new WxPayRefundV3Request.Amount();
//退款金额(单位分)
//int refund = order.getTotalAmount().scaleByPowerOfTen(2).intValue();
int refund = 100;
int refund = 8400;
amount.setRefund(refund)
.setTotal(refund)
.setCurrency("CNY");
request.setTransactionId("4200002127202401249900965739")
request.setTransactionId("4200002111202402019716818254")
//.setOutTradeNo("1000000000202401121937112562856")
//.setTransactionId(order.getOutOrderNo())
//.setOutTradeNo(order.getId())
.setNotifyUrl(wxPayProperties.getNotifyRefund())
.setOutRefundNo(IdUtils.fastSimpleUUID())
.setOutRefundNo(IdUtil.getSnowflakeNextIdStr())
.setSubMchid("1661323640")
.setReason("测试退款")
.setReason("先学后付重复核销退款")
.setAmount(amount);
WxPayRefundV3Result result = wxPayService.refundV3(request);
System.out.println(result);
@ -80,13 +81,14 @@ public class CpopWxPayTests {
//ProfitSharing profitSharing = SpringUtils.getBean(ProfitSharingService.class).getById("77860920238751744");
//profitSharingReturnRequest.setOrderId(profitSharing.getOutProfitSharingId());
//profitSharingReturnRequest.setOutReturnNo(profitSharing.getId());
profitSharingReturnRequest.setOrderId("30001002562023122858679309202");
profitSharingReturnRequest.setOutReturnNo("97948799695069184");
profitSharingReturnRequest.setOrderId("30001803972024020160326538828");
profitSharingReturnRequest.setOutReturnNo(IdUtil.getSnowflakeNextIdStr());
profitSharingReturnRequest.setDescription("分账退款");
profitSharingReturnRequest.setSubMchId("1661323640");
profitSharingReturnRequest.setReturnAccount("1618884922");
profitSharingReturnRequest.setReturnAccountType("MERCHANT_ID");
//profitSharingReturnRequest.setAmount(profitSharing.getAmount());
profitSharingReturnRequest.setReturnAmount(6);
profitSharingReturnRequest.setReturnAmount(504);
wxPayService.getProfitSharingService().profitSharingReturn(profitSharingReturnRequest);
}
@ -135,8 +137,8 @@ public class CpopWxPayTests {
public void getOrderInfo() throws WxPayException {
WxPayConfig config = wxPayService.getConfig();
config.setSubMchId("1661323640");
WxPayOrderQueryResult wxPayOrderQueryResult = wxPayService.queryOrder("4200002124202401230220836382", null);
System.out.println(wxPayOrderQueryResult);
WxPayOrderQueryResult wxPayOrderQueryResult = wxPayService.queryOrder("4200002122202402014187762767", null);
System.out.println(JSONObject.toJSONString(wxPayOrderQueryResult));
}
/**
@ -148,8 +150,8 @@ public class CpopWxPayTests {
@Test
public void getSharingInfo() throws WxPayException {
ProfitSharingQueryRequest profitSharingQueryRequest = new ProfitSharingQueryRequest();
profitSharingQueryRequest.setOutOrderNo("107321591016267776").setTransactionId("4200002119202401230387612728");
profitSharingQueryRequest.setSubMchId("1661807764");
profitSharingQueryRequest.setOutOrderNo("1736629608413073417").setTransactionId("4200002111202402019716818254");
profitSharingQueryRequest.setSubMchId("1661323640");
ProfitSharingQueryResult result = wxPayService.getProfitSharingService().profitSharingQuery(profitSharingQueryRequest);
System.out.println(result.getResultCode());
}
@ -188,7 +190,7 @@ public class CpopWxPayTests {
@Test
public void getPayScoreUserSignPlans() throws WxPayException {
wxPayService.getConfig().setServiceId("00003053000000169450961228104460");
wxPayService.getV3("https://api.mch.weixin.qq.com/v3/payscore/sign-plan/partner/user-sign-plans/merchant-sign-plan-no/1735294783081091132?sub_mchid=1618925571");
wxPayService.getV3("https://api.mch.weixin.qq.com/v3/payscore/sign-plan/partner/user-sign-plans/merchant-sign-plan-no/1736679801829396540?sub_mchid=1661323640");
}
}

View File

@ -133,8 +133,6 @@ wx:
corpId: ww9b83a363662f219f
#o2认证注册到oam中的地址
oAuth2registerUrl: https://oam.jamboxsys.com/wxCpRegister/
#登陆跳转地址
oAuth2LoginUri: https://oam.jamboxsys.com/wxCpLogin/
appConfigs:
#通讯录
- agentId: 1000000

View File

@ -71,7 +71,7 @@ public class CpopCoreTests {
System.out.println("私钥:");
System.out.println(privateKey);
System.out.println();
String source = "Admin@123";
String source = "jambox5772";
System.out.println("待加密字符串:"+source);
System.out.println();
String strEncrypt = rsaUtils.encrypt(source);

View File

@ -16,6 +16,7 @@ import com.cpop.jambox.business.service.StoreExtendService;
import com.cpop.jambox.framework.constant.JamboxCloudUrl;
import com.cpop.pay.framewok.config.wxPay.WxPayProperties;
import com.cpop.pay.framewok.handler.wxPay.WxPayHandler;
import com.github.binarywang.wxpay.bean.payscore.*;
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingBillV3Request;
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverRequest;
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingRequest;
@ -31,6 +32,7 @@ import com.github.binarywang.wxpay.bean.result.WxPayApplyBillV3Result;
import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.PartnerPayScoreSignPlanService;
import com.github.binarywang.wxpay.service.ProfitSharingService;
import com.github.binarywang.wxpay.service.WxPayService;
import com.mybatisflex.core.query.QueryWrapper;
@ -273,17 +275,62 @@ public class CpopEasyLearnTest {
@Test
public void queryOrderAndSharing() throws WxPayException {
WxPayService wxPayService = wxPayHandler.getWxPayService(null, "1663310469");
WxPayService wxPayService = wxPayHandler.getWxPayService(null, "1661323640");
WxPayOrderQueryRequest wxPayOrderQueryRequest = new WxPayOrderQueryRequest();
wxPayOrderQueryRequest.setTransactionId("4200001925202401173471747106");
wxPayOrderQueryRequest.setTransactionId("4200002116202402013721924373");
WxPayOrderQueryResult wxPayOrderQueryResult = wxPayService.queryOrder(wxPayOrderQueryRequest);
ProfitSharingService profitSharingService = wxPayService.getProfitSharingService();
ProfitSharingV3Result profitSharingV3Result = profitSharingService.profitSharingQueryV3("105490200209170432", "4200002126202401189482541307", "1663310469");
ProfitSharingOrderAmountQueryV3Result profitSharingOrderAmountQueryV3Result = profitSharingService.profitSharingUnsplitAmountQueryV3("4200001925202401173471747106");
ProfitSharingV3Result profitSharingV3Result = profitSharingService.profitSharingQueryV3("1752967538354028544", "4200002116202402013721924373", "1661323640");
System.out.println(JSONObject.toJSONString(wxPayOrderQueryResult));
System.out.println(JSONObject.toJSONString(profitSharingV3Result));
}
@Test
public void queryServiceOrder() throws WxPayException {
WxPayService wxPayService = wxPayHandler.getWxPayService();
WxPartnerPayScoreResult wxPartnerPayScoreResult = wxPayService.getPartnerPayScoreService().queryServiceOrder("00003053000000169450961228104460", "1661323640", "1736629608413073418", null);
System.out.println(JSONObject.toJSONString(wxPartnerPayScoreResult));
}
@Test
public void completeOrder() throws WxPayException {
WxPayService wxPayService = wxPayHandler.getWxPayService();
WxPartnerPayScoreRequest wxPayScoreRequest = new WxPartnerPayScoreRequest();
PostPayment postPayment = new PostPayment();
List<PostPayment> postPayments = new ArrayList<>();
postPayment.setAmount(8400);
postPayment.setName("成人hiphop基础-课程核销");
postPayments.add(postPayment);
wxPayScoreRequest.setOutOrderNo("1736679801829396489").setPostPayments(postPayments).setTotalAmount(8400);
TimeRange timeRange = new TimeRange();
timeRange.setStartTime("20240130235313");
timeRange.setEndTime("20240130235422");
wxPayScoreRequest.setTimeRange(timeRange);
wxPayScoreRequest.setSubMchid("1661323640");
wxPayScoreRequest.setServiceId("00003053000000169450961228104460");
wxPayService.getPartnerPayScoreService().completeServiceOrder(wxPayScoreRequest);
}
@Test
public void getWxPayPlan() {
WxPayService wxPayService = wxPayHandler.getWxPayService(null,"1661323640");
PartnerUserSignPlanEntity result = null;
try {
result = wxPayService.getPartnerPayScoreSignPlanService().queryUserSignPlans("1736679801829396540", "1661323640");
System.out.println(JSONObject.toJSONString(result));
} catch (WxPayException e) {
throw new RuntimeException(e);
}
}
@Test
public void queryOrder() throws WxPayException {
WxPayService wxPayService = wxPayHandler.getWxPayService(null, "1661323640");
WxPayOrderQueryResult wxPayOrderQueryResult = wxPayService.queryOrder("4200002115202401300171921108",null);
System.out.println(JSONObject.toJSONString(wxPayOrderQueryResult));
}
@Test
public void orderProfitSharing() throws WxPayException {
//固定商户信息
@ -330,7 +377,7 @@ public class CpopEasyLearnTest {
}
@Test
public void testtest(){
public void subSpecialCharacter(){
String serviceIntroduction = "排课000\uD83C\uDF3F\uD83C\uDF8B\uD83C\uDF15\uD83C\uDF44\uD83D\uDC1A";
String newServiceIntroduction = "";
//特殊字符过滤
@ -368,4 +415,6 @@ public class CpopEasyLearnTest {
|| ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
|| ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
}
}

View File

@ -1,5 +1,7 @@
package com.cpop.oam.web;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.cpop.common.utils.StringUtils;
import com.cpop.core.base.enums.OrderSource;
import com.cpop.core.utils.SpringUtils;
@ -17,6 +19,7 @@ import com.github.binarywang.wxpay.bean.payscore.PayScorePlanDetailResult;
import com.github.binarywang.wxpay.bean.payscore.WxPartnerPayScoreSignPlanResult;
import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingV3Result;
import com.github.binarywang.wxpay.bean.request.WxPayPartnerOrderQueryV3Request;
import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult;
import com.github.binarywang.wxpay.bean.result.WxPayPartnerOrderQueryV3Result;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
@ -53,7 +56,7 @@ import static com.cpop.system.business.entity.table.WxPayScoreTableDef.WX_PAY_SC
*/
@Slf4j
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles(profiles = {"prod","core"})
@ActiveProfiles(profiles = {"dev","core","pay"})
public class CpopOldDataSyncTests {
@Autowired
@ -429,4 +432,16 @@ public class CpopOldDataSyncTests {
}
@Test
public void getWxPayPlanDetail() {
WxPayService wxPayService = wxPayHandler.getWxPayService(null,"1661323640");
PartnerUserSignPlanEntity result = null;
try {
WxPayOrderQueryResult wxPayOrderQueryResult = wxPayService.queryOrder("4200002115202402010692134851", null);
System.out.println(JSONObject.toJSONString(wxPayOrderQueryResult));
} catch (WxPayException e) {
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,33 @@
package com.cpop.oam.business.bo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
/**
* @author DB
* @version 1.0.0
* @since 2024-02-04 9:30
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "EnforceFinishWorkOrderBo对象", description = "强制办结工单")
public class EnforceFinishWorkOrderBo {
/**
* 工单id
*/
@NotBlank(message = "工单id不能为空")
@ApiModelProperty(value = "工单id", required = true)
private String id;
/**
* 强制办结原因
*/
@NotBlank(message = "强制办结原因不能为空")
@ApiModelProperty(value = "强制办结原因", required = true)
private String enforceFinishReason;
}

View File

@ -111,8 +111,7 @@ public class BackstageTaskTechnologyController {
@PreAuthorize("@aps.hasPermission('oamTask:technology:deploy')")
@ApiOperation("技术模块-任务归档-设置任务归档")
@PutMapping("/setTaskArchiving/{taskId}")
public R<Void> setTaskArchiving(@PathVariable @ApiParam("任务id")
String taskId) {
public R<Void> setTaskArchiving(@PathVariable @ApiParam("任务id") String taskId) {
taskService.setTaskArchiving(taskId);
return R.ok();
}
@ -365,4 +364,18 @@ public class BackstageTaskTechnologyController {
return R.ok(vo);
}
/**
* 强制办结工单
* @author DB
* @since 2024/2/4
* @param bo 请求
* @return R<Void>
*/
@PutMapping("/enforceFinishWorkOrder")
@ApiOperation("强制办结工单")
public R<Void> enforceFinishWorkOrder(@RequestBody @Validated EnforceFinishWorkOrderBo bo) {
taskWorkOrderService.enforceFinishWorkOrder(bo);
return R.ok();
}
}

View File

@ -5,6 +5,7 @@ import com.cpop.core.base.R;
import com.cpop.core.base.entity.PageDomain;
import com.cpop.core.utils.SpringUtils;
import com.cpop.core.utils.sql.SqlUtils;
import com.cpop.oam.business.bo.EnforceFinishWorkOrderBo;
import com.cpop.oam.business.bo.TechnologyToolBo;
import com.cpop.oam.business.vo.TechnologyToolPageVo;
import com.mybatisflex.core.paginate.Page;

View File

@ -35,8 +35,8 @@ public class BackstageWxCpController {
/**
* @author LOST.yuan
* @Description 根据code换取用户信息
* @date 14:52 2022/9/7
* 根据code换取用户信息
* @since 14:52 2022/9/7
* @return {@link R<LoginUserInfoVo>}
**/
@GetMapping("/getOauth2Url")

View File

@ -1,8 +1,10 @@
package com.cpop.oam.business.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
/**
* 数据导入Dto

View File

@ -83,6 +83,11 @@ public class TaskWorkOrder extends BaseEntity implements Serializable {
*/
private LocalDateTime pauseExpireTime;
/**
* 强制办结原因
*/
private String enforceFinishReason;
/**
* 是否删除(0否1是)
*/

View File

@ -1,5 +1,6 @@
package com.cpop.oam.business.service;
import com.cpop.oam.business.bo.EnforceFinishWorkOrderBo;
import com.cpop.oam.business.vo.*;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
@ -122,4 +123,12 @@ public interface TaskWorkOrderService extends IService<TaskWorkOrder> {
* @return R<Page<TaskWorkOrderPageVo>>
*/
Page<TaskWorkOrderStatPageVo> getWorkOrderStatPage(String staffId,LocalDate startDate,LocalDate endDate);
/**
* 强制办结工单
* @author DB
* @since 2024/2/4
* @param bo 请求参数
*/
void enforceFinishWorkOrder(EnforceFinishWorkOrderBo bo);
}

View File

@ -46,6 +46,8 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
@ -87,7 +89,6 @@ public class DataImportServiceImpl extends ServiceImpl<DataImportMapper, DataImp
.orderBy(DATA_IMPORT.CREATE_TIME.desc()),
DataImportPageVo.class);
}
/**
* 新增数据导入
* @author DB
@ -174,57 +175,81 @@ public class DataImportServiceImpl extends ServiceImpl<DataImportMapper, DataImp
EasyExcel.read(file.getInputStream(), DataImportDto.class, new ReadListener<DataImportDto>() {
@Override
public void invoke(DataImportDto dataImportDto, AnalysisContext analysisContext) {
//检查手机号
if (StringUtils.isBlank(dataImportDto.getName())) {
throw new ServiceException(String.format("第%s行姓名为空请核实", analysisContext.readRowHolder().getRowIndex() + 1));
}
//检查手机号
if (StringUtils.isBlank(dataImportDto.getPhone())) {
dataImportDto.setPhone(IdUtil.getSnowflakeNextIdStr());
}
//课卡类型
if (StringUtils.isBlank(dataImportDto.getCardType())) {
dataImportDto.setCardType("少儿");
}
//计费类型
if (StringUtils.isBlank(dataImportDto.getBillingType())) {
dataImportDto.setBillingType("限时卡");
}
//首充课时
if (dataImportDto.getFirstChargePeriod() == null) {
dataImportDto.setFirstChargePeriod(0);
}
//剩余课时
if (dataImportDto.getRemainingClassHours() == null) {
dataImportDto.setFirstChargePeriod(0);
}
//消费金额
if (dataImportDto.getAmountSpent() == null) {
dataImportDto.setAmountSpent(0);
}
//课程顾问
if (StringUtils.isBlank(dataImportDto.getBillingType())) {
dataImportDto.setBillingType("校长");
}
//性别
if (StringUtils.isBlank(dataImportDto.getSex())) {
dataImportDto.setSex("");
}
//课卡名称
if (StringUtils.isBlank(dataImportDto.getCardName())) {
throw new ServiceException(String.format("第%s行课卡名称为空请核实", analysisContext.readRowHolder().getRowIndex() + 1));
}
//停卡时剩余天数
if (dataImportDto.getStopCardRemainingDays() == null) {
dataImportDto.setStopCardRemainingDays(0);
dataImportDto.setCardStatus("使用中");
//计费类型
if (!StringUtils.equals(dataImportDto.getBillingType(), "储值卡")) {
throw new ServiceException(String.format("第%s行计费类型不为储值卡时课卡类型不能为空请核实", analysisContext.readRowHolder().getRowIndex() + 1));
}
} else {
dataImportDto.setCardStatus("停卡");
}
//停卡缓冲天数
if (dataImportDto.getStopCardBufferDays() == null) {
dataImportDto.setStopCardBufferDays(0);
}
if (dataImportDto.getStopCardBufferDays() != 0 && StringUtils.equals("使用中", dataImportDto.getCardStatus())) {
dataImportDto.setCardStatus("未激活");
} else if (dataImportDto.getStopCardBufferDays() != 0 && StringUtils.equals("停卡", dataImportDto.getCardStatus())) {
dataImportDto.setCardStatus("停卡未激活");
//计费类型
if (!StringUtils.equals(dataImportDto.getBillingType(), "暂无")) {
//计费类型
if (StringUtils.isBlank(dataImportDto.getBillingType())) {
throw new ServiceException(String.format("第%s行课卡类型不为暂无时计费类型不能为空请核实", analysisContext.readRowHolder().getRowIndex() + 1));
} else {
if (!StringUtils.equals(dataImportDto.getBillingType(), "时限卡")){
//首充课时
if (dataImportDto.getFirstChargePeriod() == null || dataImportDto.getFirstChargePeriod() <= 0) {
throw new ServiceException(String.format("第%s行计费类型不为时限卡时首充课时不能为空或0请核实", analysisContext.readRowHolder().getRowIndex() + 1));
}
}
}
//剩余课时
if (dataImportDto.getRemainingClassHours() == null) {
dataImportDto.setFirstChargePeriod(0);
}
//消费金额
if (dataImportDto.getAmountSpent() == null) {
dataImportDto.setAmountSpent(0);
}
//验证日期是否标准并且办卡日期小于有效期
if (StringUtils.isBlank(dataImportDto.getExpiryDate()) || StringUtils.isBlank(dataImportDto.getCreateCardDate())) {
throw new ServiceException(String.format("第%s行办卡日期或到期日期不能为空请核实", analysisContext.readRowHolder().getRowIndex() + 1));
} else {
LocalDate expiryDate = LocalDate.parse(dataImportDto.getExpiryDate(), DateTimeFormatter.ofPattern("yyyy/M/d"));
LocalDate createCardDate = LocalDate.parse(dataImportDto.getExpiryDate(), DateTimeFormatter.ofPattern("yyyy/M/d"));
if (expiryDate.isBefore(createCardDate)) {
throw new ServiceException(String.format("第%s行办卡日期不能大于到期日期请核实", analysisContext.readRowHolder().getRowIndex() + 1));
}
}
//课程顾问
if (StringUtils.isBlank(dataImportDto.getBillingType())) {
dataImportDto.setBillingType("校长");
}
//性别
if (StringUtils.isBlank(dataImportDto.getSex())) {
dataImportDto.setSex("");
}
//课卡名称
if (StringUtils.isBlank(dataImportDto.getCardName())) {
throw new ServiceException(String.format("第%s行课卡名称为空请核实", analysisContext.readRowHolder().getRowIndex() + 1));
}
//停卡时剩余天数
if (dataImportDto.getStopCardRemainingDays() == null) {
dataImportDto.setStopCardRemainingDays(0);
dataImportDto.setCardStatus("使用中");
} else {
dataImportDto.setCardStatus("停卡");
}
//停卡缓冲天数
if (dataImportDto.getStopCardBufferDays() == null) {
dataImportDto.setStopCardBufferDays(0);
}
if (dataImportDto.getStopCardBufferDays() != 0 && StringUtils.equals("使用中", dataImportDto.getCardStatus())) {
dataImportDto.setCardStatus("未激活");
} else if (dataImportDto.getStopCardBufferDays() != 0 && StringUtils.equals("停卡", dataImportDto.getCardStatus())) {
dataImportDto.setCardStatus("停卡未激活");
}
}
}
cachedDataList.add(dataImportDto);
}
@ -259,7 +284,6 @@ public class DataImportServiceImpl extends ServiceImpl<DataImportMapper, DataImp
EasyExcel.write(tempFile.getPath(), DataImportDto.class)
.sheet("模板")
.doWrite(() -> {
// 分页查询数据
return cachedDataList;
});
MultipartFile multipartFile = FileUtils.getInstance().getMultipartFile(tempFile);

View File

@ -12,10 +12,7 @@ import com.cpop.core.utils.QuartzUtils;
import com.cpop.core.utils.SecurityUtils;
import com.cpop.core.utils.SpringUtils;
import com.cpop.core.utils.sql.SqlUtils;
import com.cpop.oam.business.bo.PauseWorkOrderBo;
import com.cpop.oam.business.bo.TaskDemandBo;
import com.cpop.oam.business.bo.TaskWorkOrderBo;
import com.cpop.oam.business.bo.TaskWorkOrderRecordBo;
import com.cpop.oam.business.bo.*;
import com.cpop.oam.business.dto.TaskWorkOrderReceiveDealPauseDto;
import com.cpop.oam.business.entity.*;
import com.cpop.oam.business.mapper.TaskWorkOrderMapper;
@ -24,9 +21,7 @@ import com.cpop.oam.business.vo.*;
import com.cpop.oam.framework.constant.WebHookKeyConstant;
import com.cpop.oam.framework.enums.OamConfigEnum;
import com.cpop.oam.framework.enums.QuartzEnums;
import com.cpop.oam.framework.tasks.WorkOrderAcceptOverTimeTask;
import com.cpop.oam.framework.tasks.WorkOrderOvertimeTask;
import com.cpop.oam.framework.tasks.WorkOrderPauseRecoverTask;
import com.cpop.oam.framework.tasks.*;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
@ -279,7 +274,91 @@ public class TaskWorkOrderServiceImpl extends ServiceImpl<TaskWorkOrderMapper, T
}
}
// 添加未接收任务
startOrRemoveWorkOrderAcceptTask(entity.getId(), true, LocalDateTime.now());
LocalDateTime now = LocalDateTime.now();
startOrRemoveWorkOrderAcceptTask(entity.getId(), true, now);
// 添加未接收工单超时提醒任务
startOrRemoveWorkOrderAcceptOverTimeRemindTask(entity.getId(), true, now);
}
/**
* 工单接受超时提醒任务
* @author DB
* @since 2024/2/4
* @param workOrderId 工单id
* @param isStart 是否是开始标识
* @param dateTime 时间
*/
private void startOrRemoveWorkOrderAcceptOverTimeRemindTask(String workOrderId, Boolean isStart, LocalDateTime dateTime) {
// 基于表达式构建触发器
QuartzUtils quartzUtils = SpringUtils.getBean(QuartzUtils.class);
try {
QuartzEnums acceptEnums = QuartzEnums.WORK_ORDER_ACCEPT_OVERTIME_REMIND_TASK;
// 开始
if (isStart) {
// 通过JobBuilder构建JobDetail实例JobDetail规定其job只能是实现Job接口的实例
JobDetail jobDetail = JobBuilder.newJob(WorkOrderAcceptOverTimeRemindTask.class)
.withIdentity(acceptEnums.getName() + workOrderId, acceptEnums.getGroup())
.usingJobData("WorkOrderId", workOrderId)
.build();
LocalDateTime localDateTime = dateTime.plusMinutes(25);
ZoneId zoneId = ZoneId.systemDefault();
String cron = quartzUtils.convertToCron(Date.from(localDateTime.atZone(zoneId).toInstant()));
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
// CronTrigger表达式触发器 继承于TriggerTriggerBuilder 用于构建触发器实例
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
.withIdentity(acceptEnums.getName() + workOrderId, acceptEnums.getGroup())
.withSchedule(cronScheduleBuilder)
.build();
scheduler.scheduleJob(jobDetail, cronTrigger);
} else {
// 删除
quartzUtils.deleteJob(acceptEnums.getName() + workOrderId, acceptEnums.getGroup());
}
} catch (SchedulerException | ParseException e) {
throw new ServiceException("生成工单接收任务失败!");
}
}
/**
* 工单完结超时提醒
* @author DB
* @since 2024/2/4
* @param workOrderId 工单id
* @param status 命令状态 0新增1更新2删除
* @param dateTime 时间
*/
private void workOrderFinishOverTimeRemindTask(String workOrderId, Integer status, LocalDateTime dateTime) {
// 基于表达式构建触发器
QuartzUtils quartzUtils = SpringUtils.getBean(QuartzUtils.class);
try {
QuartzEnums acceptEnums = QuartzEnums.WORK_ORDER_FINISH_OVERTIME_REMIND_TASK;
LocalDateTime localDateTime = dateTime.plusMinutes(105);
ZoneId zoneId = ZoneId.systemDefault();
String cron = quartzUtils.convertToCron(Date.from(localDateTime.atZone(zoneId).toInstant()));
// 开始
if (status == 0) {
// 通过JobBuilder构建JobDetail实例JobDetail规定其job只能是实现Job接口的实例
JobDetail jobDetail = JobBuilder.newJob(WorkOrderFinishOverTimeRemindTask.class)
.withIdentity(acceptEnums.getName() + workOrderId, acceptEnums.getGroup())
.usingJobData("WorkOrderId", workOrderId)
.build();
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
// CronTrigger表达式触发器 继承于TriggerTriggerBuilder 用于构建触发器实例
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
.withIdentity(acceptEnums.getName() + workOrderId, acceptEnums.getGroup())
.withSchedule(cronScheduleBuilder)
.build();
scheduler.scheduleJob(jobDetail, cronTrigger);
} else if (status == 1) {
//修改
quartzUtils.modifyJob(acceptEnums.getName() + workOrderId, QuartzEnums.WORK_ORDER_OVERTIME_TASK.getGroup(), cron);
} else {
// 删除
quartzUtils.deleteJob(acceptEnums.getName() + workOrderId, acceptEnums.getGroup());
}
} catch (SchedulerException | ParseException e) {
throw new ServiceException("生成工单接收任务失败!");
}
}
/**
@ -535,7 +614,10 @@ public class TaskWorkOrderServiceImpl extends ServiceImpl<TaskWorkOrderMapper, T
if (task.getTaskStatus() == 2) {
startOrUpdateWorkOrderOvertimeTask(bo.getWorkOrderId(), true, bo.getPauseExpireTime());
}
// 工单暂停
startOrRemoveWorkOrderPauseRecover(bo.getWorkOrderId(), true, bo.getPauseExpireTime());
// 工单完结超时
workOrderFinishOverTimeRemindTask(bo.getWorkOrderId(), 1, bo.getPauseExpireTime());
// 设定任务状态暂停
task.setTaskStatus(5);
taskService.updateById(task);
@ -677,7 +759,10 @@ public class TaskWorkOrderServiceImpl extends ServiceImpl<TaskWorkOrderMapper, T
SpringUtils.getBean(QuartzUtils.class)
.deleteJob(QuartzEnums.WORK_ORDER_OVERTIME_TASK.getName() + workOrderId,
QuartzEnums.WORK_ORDER_OVERTIME_TASK.getGroup());
// 删除工单暂停恢复任务
startOrRemoveWorkOrderPauseRecover(workOrderId, false, null);
// 删除工单完结超时任务
workOrderFinishOverTimeRemindTask(workOrderId, 2, null);
} catch (SchedulerException e) {
throw new ServiceException("删除工单完结超时任务失败");
}
@ -754,13 +839,17 @@ public class TaskWorkOrderServiceImpl extends ServiceImpl<TaskWorkOrderMapper, T
.set(TASK.TASK_RECEIPT_TIME, now)
.where(TASK.ID.eq(task.getId()))
.update();
Duration duration = Duration.between(now, workOrder.getCreateTime());
Duration duration = Duration.between(workOrder.getCreateTime(), now);
workOrder.setReceivingTime((int) duration.toMinutes());
this.updateById(workOrder);
//删除工单接收超时任务
startOrRemoveWorkOrderAcceptTask(taskWorkOrderId, false, now);
//删除工单接收超时提醒任务
startOrRemoveWorkOrderAcceptOverTimeRemindTask(taskWorkOrderId, false, now);
//生成工单处理超时任务
startOrUpdateWorkOrderOvertimeTask(taskWorkOrderId, false, now);
//生成工单完结超时任务提醒
workOrderFinishOverTimeRemindTask(taskWorkOrderId, 0, now);
}
}
}
@ -845,4 +934,15 @@ public class TaskWorkOrderServiceImpl extends ServiceImpl<TaskWorkOrderMapper, T
}
}));
}
/**
* 强制办结工单
* @author DB
* @since 2024/2/4
* @param bo 请求参数
*/
@Override
public void enforceFinishWorkOrder(EnforceFinishWorkOrderBo bo) {
throw new ServiceException("功能未实现");
}
}

View File

@ -21,4 +21,9 @@ public interface WebHookKeyConstant {
* 技术-售后
*/
String ORDER_INFO_BOT = "0423ac02-dc26-4b4e-b67f-4e0f0953013f";
/**
* 市场部
*/
String MARKET_BOT = "146d2f06-a6af-46b2-9b22-103ee58cd022";
}

View File

@ -1,10 +1,13 @@
package com.cpop.oam.framework.enums;
import lombok.Getter;
/**
* @author: DB
* @Date: 2023/07/13/9:30
* @Description: 定时任务枚举类
* 定时任务枚举类
* @author DB
* @since 2023/07/13/9:30
*/
@Getter
public enum QuartzEnums {
/**
@ -18,7 +21,18 @@ public enum QuartzEnums {
/**
* 工单暂停回复任务
*/
WORK_ORDER_PAUSE_RECOVER_TASK("WorkOrderPauseRecoverTask:", "WorkOrder");;
WORK_ORDER_PAUSE_RECOVER_TASK("WorkOrderPauseRecoverTask:", "WorkOrder"),
/**
* 工单接受超时提醒
*/
WORK_ORDER_ACCEPT_OVERTIME_REMIND_TASK("WorkOrderAcceptOvertimeRemindTask:", "WorkOrder"),
/**
* 工单办结超时提醒
*/
WORK_ORDER_FINISH_OVERTIME_REMIND_TASK("WorkOrderFinishOvertimeRemindTask:", "WorkOrder"),
;
QuartzEnums(String name, String group) {
this.name = name;
@ -35,18 +49,10 @@ public enum QuartzEnums {
*/
private String group;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGroup() {
return group;
}
public void setGroup(String group) {
this.group = group;
}

View File

@ -0,0 +1,57 @@
package com.cpop.oam.framework.tasks;
import com.cpop.api.tencent.wxWork.handler.WebHookSendHandler;
import com.cpop.core.base.exception.ServiceException;
import com.cpop.core.utils.SpringUtils;
import com.cpop.oam.business.entity.Duty;
import com.cpop.oam.business.entity.Task;
import com.cpop.oam.business.entity.TaskWorkOrder;
import com.cpop.oam.business.service.*;
import com.cpop.oam.business.vo.StaffInfoVo;
import com.cpop.oam.framework.constant.WebHookKeyConstant;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static com.cpop.oam.business.entity.table.DutyTableDef.DUTY;
import static com.cpop.oam.business.entity.table.TaskStaffGroupTableDef.TASK_STAFF_GROUP;
import static com.cpop.oam.business.entity.table.TaskTableDef.TASK;
/**
* @author DB
*/
public class WorkOrderAcceptOverTimeRemindTask implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) {
// 获取工单id
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
String workOrderId = jobDataMap.getString("WorkOrderId");
TaskWorkOrderService taskWorkOrderService = SpringUtils.getBean(TaskWorkOrderService.class);
TaskWorkOrder workOrder = taskWorkOrderService.getById(workOrderId);
//获取工单任务创建日期的值班人员
Duty duty = SpringUtils.getBean(DutyService.class).queryChain()
.where(DUTY.DUTY_DATE.eq(workOrder.getCreateTime().toLocalDate()))
.one();
List<String> phoneList = new ArrayList<>();
if (duty != null){
// 获取任务
TaskService taskService = SpringUtils.getBean(TaskService.class);
Task task = taskService.getById(workOrder.getTaskId());
StaffService staffService = SpringUtils.getBean(StaffService.class);
StaffInfoVo responsibleStaff = staffService.getStaffInfo(duty.getTechnologyStaffId());
phoneList.add(responsibleStaff.getPhoneNumber());
try {
SpringUtils.getBean(WebHookSendHandler.class).webHookSendText(WebHookKeyConstant.ORDER_INFO_BOT, phoneList,
task.getTaskContent() + "\n您有一个工单即将接受超时,请尽快接受",
false);
} catch (IOException e) {
throw new ServiceException("发送工单接受超时消息通知失败!");
}
}
}
}

View File

@ -24,8 +24,6 @@ import org.slf4j.LoggerFactory;
*/
public class WorkOrderAcceptOverTimeTask implements Job {
private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class);
@Override
public void execute(JobExecutionContext jobExecutionContext) {
// 获取工单id

View File

@ -0,0 +1,57 @@
package com.cpop.oam.framework.tasks;
import com.cpop.api.tencent.wxWork.handler.WebHookSendHandler;
import com.cpop.core.base.exception.ServiceException;
import com.cpop.core.utils.SpringUtils;
import com.cpop.oam.business.entity.Duty;
import com.cpop.oam.business.entity.Task;
import com.cpop.oam.business.entity.TaskWorkOrder;
import com.cpop.oam.business.service.DutyService;
import com.cpop.oam.business.service.StaffService;
import com.cpop.oam.business.service.TaskService;
import com.cpop.oam.business.service.TaskWorkOrderService;
import com.cpop.oam.business.vo.StaffInfoVo;
import com.cpop.oam.framework.constant.WebHookKeyConstant;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static com.cpop.oam.business.entity.table.DutyTableDef.DUTY;
/**
* 工单完结超时提醒任务
* @author DB
*/
public class WorkOrderFinishOverTimeRemindTask implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) {
// 获取工单id
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
String workOrderId = jobDataMap.getString("WorkOrderId");
TaskWorkOrderService taskWorkOrderService = SpringUtils.getBean(TaskWorkOrderService.class);
TaskWorkOrder workOrder = taskWorkOrderService.getById(workOrderId);
// 获取任务
TaskService taskService = SpringUtils.getBean(TaskService.class);
Task task = taskService.getById(workOrder.getTaskId());
List<String> phoneList = new ArrayList<>();
if (task != null){
StaffService staffService = SpringUtils.getBean(StaffService.class);
StaffInfoVo responsibleStaff = staffService.getStaffInfo(task.getResponsibleStaffId());
StaffInfoVo recordStaff = staffService.getStaffInfo(task.getRecordStaffId());
phoneList.add(responsibleStaff.getPhoneNumber());
phoneList.add(recordStaff.getPhoneNumber());
try {
SpringUtils.getBean(WebHookSendHandler.class).webHookSendText(WebHookKeyConstant.ORDER_INFO_BOT, phoneList,
task.getTaskContent() + "\n您有一个工单即将完结超时,请尽快练习相关人员办结",
false);
} catch (IOException e) {
throw new ServiceException("发送工单完结超时消息通知失败!");
}
}
}
}