From 9cf9a60a63e7f53919e440b2c26b2e1494626b24 Mon Sep 17 00:00:00 2001 From: DB <2502523450@qq.com> Date: Thu, 30 Nov 2023 09:00:25 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wxWork/handler/WebHookSendHandler.java | 1 + .../com/cpop/core/base/entity/BaseEntity.java | 4 +- .../java/com/cpop/core/utils/QuartzUtils.java | 1 + .../cpop/generator/template/BoGenerator.java | 1 - .../cpop/jambox/business/vo/BrandListVo.java | 2 +- .../src/main/resources/application-dev.yml | 12 +- .../src/main/resources/application-prod.yml | 2 +- .../src/main/resources/application-test.yml | 2 +- .../src/main/resources/application-dev.yml | 17 +- .../src/main/resources/application-prod.yml | 7 +- .../src/main/resources/application-test.yml | 7 +- .../com/cpop/oam/web/CpopImportTests.java | 109 ++- Cpop-Oam/pom.xml | 10 + .../oam/business/bo/PauseWorkOrderBo.java | 24 +- .../cpop/oam/business/bo/TaskWorkOrderBo.java | 24 +- .../business/bo/TaskWorkOrderRecordBo.java | 13 +- .../backstage/TaskWorkOrderController.java | 232 ++++-- .../dto/TaskWorkOrderReceiveDealPauseDto.java | 102 ++- .../com/cpop/oam/business/entity/Task.java | 6 +- .../oam/business/entity/TaskWorkOrder.java | 27 +- .../service/TaskWorkOrderService.java | 107 ++- .../impl/TaskWorkOrderServiceImpl.java | 663 ++++++++++++------ .../com/cpop/oam/business/vo/StoreListVo.java | 32 +- .../oam/business/vo/TaskWorkOrderPageVo.java | 94 +-- .../vo/TaskWorkOrderReceiveDealPauseVo.java | 225 +++++- .../vo/TaskWorkOrderRecordListVo.java | 14 +- .../cpop/oam/business/vo/WorkOrderDutyVo.java | 56 ++ .../cpop/oam/framework/enums/QuartzEnums.java | 6 +- .../tasks/WorkOrderAcceptOverTimeTask.java | 52 ++ .../tasks/WorkOrderOvertimeTask.java | 27 +- .../com/cpop/system/business/bo/BrandBo.java | 6 - .../cpop/system/business/entity/Brand.java | 5 - .../cpop/system/business/entity/Store.java | 5 - .../service/impl/BrandServiceImpl.java | 3 +- .../cpop/system/business/vo/BrandPageVo.java | 25 - .../cpop/system/business/vo/StorePageVo.java | 16 +- 36 files changed, 1402 insertions(+), 537 deletions(-) create mode 100644 Cpop-Oam/src/main/java/com/cpop/oam/business/vo/WorkOrderDutyVo.java create mode 100644 Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderAcceptOverTimeTask.java diff --git a/Cpop-Api/src/main/java/com/cpop/api/tencent/wxWork/handler/WebHookSendHandler.java b/Cpop-Api/src/main/java/com/cpop/api/tencent/wxWork/handler/WebHookSendHandler.java index 5816804..8b35e58 100644 --- a/Cpop-Api/src/main/java/com/cpop/api/tencent/wxWork/handler/WebHookSendHandler.java +++ b/Cpop-Api/src/main/java/com/cpop/api/tencent/wxWork/handler/WebHookSendHandler.java @@ -5,6 +5,7 @@ import com.cpop.api.tencent.wxWork.core.config.WxWorkApiConfig; import com.cpop.api.tencent.wxWork.webHook.WebHookSendTextRequest; import okhttp3.*; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import java.io.IOException; diff --git a/Cpop-Core/src/main/java/com/cpop/core/base/entity/BaseEntity.java b/Cpop-Core/src/main/java/com/cpop/core/base/entity/BaseEntity.java index cdfe1a6..b71cccf 100644 --- a/Cpop-Core/src/main/java/com/cpop/core/base/entity/BaseEntity.java +++ b/Cpop-Core/src/main/java/com/cpop/core/base/entity/BaseEntity.java @@ -11,9 +11,7 @@ import java.util.Map; * @author LOST.yuan */ @Data -public class BaseEntity implements Serializable { - - private static final long serialVersionUID = -5809782578272943991L; +public class BaseEntity { private LocalDateTime createTime; diff --git a/Cpop-Core/src/main/java/com/cpop/core/utils/QuartzUtils.java b/Cpop-Core/src/main/java/com/cpop/core/utils/QuartzUtils.java index 54a2b16..7f310b4 100644 --- a/Cpop-Core/src/main/java/com/cpop/core/utils/QuartzUtils.java +++ b/Cpop-Core/src/main/java/com/cpop/core/utils/QuartzUtils.java @@ -5,6 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.text.ParseException; +import java.time.LocalDate; import java.util.Calendar; import java.util.Date; diff --git a/Cpop-Generator/src/main/java/com/cpop/generator/template/BoGenerator.java b/Cpop-Generator/src/main/java/com/cpop/generator/template/BoGenerator.java index 66a9f1b..c06ed34 100644 --- a/Cpop-Generator/src/main/java/com/cpop/generator/template/BoGenerator.java +++ b/Cpop-Generator/src/main/java/com/cpop/generator/template/BoGenerator.java @@ -46,7 +46,6 @@ public class BoGenerator implements IGenerator { if (boJavaFile.exists() && !entityConfig.isOverwriteEnable()) { return; } - Map params = new HashMap<>(4); params.put("table", table); params.put("entityConfig", entityConfig); diff --git a/Cpop-Jambox/src/main/java/com/cpop/jambox/business/vo/BrandListVo.java b/Cpop-Jambox/src/main/java/com/cpop/jambox/business/vo/BrandListVo.java index c411fbd..30fab5e 100644 --- a/Cpop-Jambox/src/main/java/com/cpop/jambox/business/vo/BrandListVo.java +++ b/Cpop-Jambox/src/main/java/com/cpop/jambox/business/vo/BrandListVo.java @@ -36,5 +36,5 @@ public class BrandListVo implements Serializable { * 品牌名 */ @ApiModelProperty("品牌名") - private String name; + private String brandName; } diff --git a/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application-dev.yml b/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application-dev.yml index 2abd731..2e75746 100644 --- a/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application-dev.yml +++ b/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application-dev.yml @@ -23,7 +23,8 @@ spring: #端口 port: 6333 #数据库 - database: 10 + #database: 10 + database: 0 #密码 password: Jambox.123* #连接超时 @@ -55,17 +56,14 @@ mybatis-flex: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl datasource: mall: - url: jdbc:mysql://sh-cynosdbmysql-grp-fggo83js.sql.tencentcdb.com:20965/cpop_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + #url: jdbc:mysql://sh-cynosdbmysql-grp-fggo83js.sql.tencentcdb.com:20965/cpop_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://sh-cynosdbmysql-grp-fggo83js.sql.tencentcdb.com:20965/cpop_union?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: Customer0401 jambox: url: jdbc:mysql://sh-cynosdbmysql-grp-fggo83js.sql.tencentcdb.com:20965/jambox_test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true username: root password: Customer0401 - cbc: - url: jdbc:mysql://192.168.3.10:3306/cbc_game_prod?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true - username: nft - password: nft # springdoc-openapi项目配置 knife4j: @@ -129,4 +127,4 @@ wx: #退款通知地址 notifyRefund: https://frp-oak.top:11899/Cpop-Mall/wxPay/callback/notify/refund #分账通知地址 - notifySharing: https://frp-oak.top:11899/Cpop-Mall/wxPay/callback/notify/profitSharing \ No newline at end of file + notifySharing: https://frp-oak.top:11899/Cpop-Mall/wxPay/callback/notify/profitSharing diff --git a/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application-prod.yml b/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application-prod.yml index 5c92f0e..a07665d 100644 --- a/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application-prod.yml +++ b/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application-prod.yml @@ -90,4 +90,4 @@ wx: #退款通知地址 notifyRefund: https://api.jamboxsys.com/Cpop-Mall/wxPay/callback/notify/refund #分账通知地址 - notifySharing: https://api.jamboxsys.com/Cpop-Mall/wxPay/callback/notify/profitSharing \ No newline at end of file + notifySharing: https://api.jamboxsys.com/Cpop-Mall/wxPay/callback/notify/profitSharing diff --git a/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application-test.yml b/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application-test.yml index 0602a22..4512723 100644 --- a/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application-test.yml +++ b/Cpop-Mall/Cpop-Mall-Web/src/main/resources/application-test.yml @@ -120,4 +120,4 @@ wx: #退款通知地址 notifyRefund: https://test.cpopsz.com/onlineShop/wxPay/callback/notify/refund #分账通知地址 - notifySharing: https://test.cpopsz.com/onlineShop/wxPay/callback/notify/profitSharing \ No newline at end of file + notifySharing: https://test.cpopsz.com/onlineShop/wxPay/callback/notify/profitSharing diff --git a/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-dev.yml b/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-dev.yml index 961ca8c..74b080a 100644 --- a/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-dev.yml +++ b/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-dev.yml @@ -1,16 +1,16 @@ # 项目相关配置 cpop: # 文件路径 示例( Windows配置W:/WorkSpace/java/uploadPath,Linux配置 /home/baseFramework/uploadPath) - profile: D:/Cpop/uploadPath + profile: E:/Cpop/uploadPath jwt: #白名单 whiteList: /websocket/*,/login,/getCaptcha,/profile/**,/doc.html,/webjars/**,/favicon.ico,/v2/api-docs/**,/swagger-resources,/wxCp/*,/wxCp/portal/*/registerCode gateway: rsa-keypair: # 公钥文件 - publicKeyFile: D:\Cpop\Cpop-Union\Cpop-Core\src\main\resources\static\keyPair\publicKey + publicKeyFile: E:\Cpop\Cpop-Union\Cpop-Core\src\main\resources\static\keyPair\publicKey # 公钥文件 - privateKeyFile: D:\Cpop\Cpop-Union\Cpop-Core\src\main\resources\static\keyPair\privateKey + privateKeyFile: E:\Cpop\Cpop-Union\Cpop-Core\src\main\resources\static\keyPair\privateKey # DataSource Config spring: @@ -43,6 +43,11 @@ spring: host: localhost port: 27017 database: cpop-union + # 热部署 + devtools: + restart: + # 开启热部署(更改文件后,自动重启) + enabled: true server: port: 9420 @@ -88,8 +93,8 @@ knife4j: wx: pay: # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头) - keyPath: D:/Cpop/Cpop-Union/Cpop-Core/src/main/resources/static/keyPair/wxPay_cert.p12 + keyPath: E:/Cpop/Cpop-Union/Cpop-Core/src/main/resources/static/keyPair/wxPay_cert.p12 # 私钥证书 - privateKeyPath: D:/Cpop/Cpop-Union/Cpop-Core/src/main/resources/static/keyPair/wxPay_key.pem + privateKeyPath: E:/Cpop/Cpop-Union/Cpop-Core/src/main/resources/static/keyPair/wxPay_key.pem # 私钥文件 - privateCertPath: D:/Cpop/Cpop-Union/Cpop-Core/src/main/resources/static/keyPair/wxPay_cert.pem \ No newline at end of file + privateCertPath: E:/Cpop/Cpop-Union/Cpop-Core/src/main/resources/static/keyPair/wxPay_cert.pem diff --git a/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-prod.yml b/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-prod.yml index c0b3d30..08dfc99 100644 --- a/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-prod.yml +++ b/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-prod.yml @@ -44,6 +44,11 @@ spring: host: localhost port: 27017 database: rock-blade + # 热部署 + devtools: + restart: + # 开启热部署(更改文件后,自动重启) + enabled: false server: port: 9420 @@ -72,4 +77,4 @@ wx: # 私钥证书 privateKeyPath: /root/cpop-union/cpop-oam/script/secretKey/wxPay_key.pem # 私钥文件 - privateCertPath: /root/cpop-union/cpop-oam/script/secretKey/wxPay_cert.pem \ No newline at end of file + privateCertPath: /root/cpop-union/cpop-oam/script/secretKey/wxPay_cert.pem diff --git a/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-test.yml b/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-test.yml index 3534d6c..8159444 100644 --- a/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-test.yml +++ b/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-test.yml @@ -44,6 +44,11 @@ spring: host: localhost port: 27017 database: rock-blade + # 热部署 + devtools: + restart: + # 开启热部署(更改文件后,自动重启) + enabled: false server: port: 8420 @@ -93,4 +98,4 @@ wx: # 私钥证书 privateKeyPath: /root/cpop-union/cpop-oam/script/secretKey/wxPay_key.pem # 私钥文件 - privateCertPath: /root/cpop-union/cpop-oam/script/secretKey/wxPay_cert.pem \ No newline at end of file + privateCertPath: /root/cpop-union/cpop-oam/script/secretKey/wxPay_cert.pem diff --git a/Cpop-Oam/Cpop-Oam-Web/src/test/java/com/cpop/oam/web/CpopImportTests.java b/Cpop-Oam/Cpop-Oam-Web/src/test/java/com/cpop/oam/web/CpopImportTests.java index 1e5ed8c..5f4b8e8 100644 --- a/Cpop-Oam/Cpop-Oam-Web/src/test/java/com/cpop/oam/web/CpopImportTests.java +++ b/Cpop-Oam/Cpop-Oam-Web/src/test/java/com/cpop/oam/web/CpopImportTests.java @@ -2,23 +2,45 @@ package com.cpop.oam.web; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.annotation.JSONField; +import com.cpop.common.utils.StringUtils; +import com.cpop.common.utils.bean.BeanUtils; +import com.cpop.core.base.enums.SourceType; +import com.cpop.core.utils.SpringUtils; +import com.cpop.jambox.business.entity.BrandExtend; +import com.cpop.jambox.business.entity.StoreExtend; +import com.cpop.jambox.business.service.BrandExtendService; +import com.cpop.jambox.business.service.StoreExtendService; +import com.cpop.system.business.entity.Brand; +import com.cpop.system.business.entity.Store; +import com.cpop.system.business.service.BrandService; +import com.cpop.system.business.service.StoreService; +import com.mybatisflex.core.row.DbChain; +import com.mybatisflex.core.row.Row; import lombok.Data; +import lombok.Value; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Transactional; import java.io.*; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; +import static com.cpop.jambox.business.entity.table.BrandExtendTableDef.BRAND_EXTEND; +import static com.cpop.system.business.entity.table.BrandTableDef.BRAND; + /** * @author DB * @createTime 2023/11/27 17:24 * @description 导入数据 */ -@SpringBootTest @Slf4j +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class CpopImportTests { /** @@ -29,7 +51,7 @@ public class CpopImportTests { */ @Test public void importBrandJson() throws IOException { - String brandFileUrl = ""; + String brandFileUrl = "C:\\Users\\Administrator\\Desktop\\brand.json"; List filterList = new ArrayList<>(); filterList.add("b00064a760d0c4f121b0835d09b909ca"); filterList.add("ac1268b164d1d20700080aae1703ecf8"); @@ -38,9 +60,21 @@ public class CpopImportTests { //过滤已存在的品牌 List filterBrand = jsonBrands.stream().filter(item -> !filterList.contains(item.getBrandCloudId())).collect(Collectors.toList()); //打印 + Map brandJsonBrandMap = new HashMap<>(); filterBrand.forEach(item -> { - log.info("品牌信息:{}", item.toString()); + Brand brand = new Brand(); + brand.setSourceType(SourceType.JAMBOX.toString()) + .setBrandName(item.getBrandName()); + BrandExtend brandExtend = new BrandExtend(); + brandExtend.setBrandCloudId(item.getBrandCloudId()); + brandJsonBrandMap.put(brandExtend, brand); }); + SpringUtils.getBean(BrandService.class).saveBatch(brandJsonBrandMap.values()) ; + //批量插入拓展信息 + brandJsonBrandMap.forEach((key, value) -> { + key.setBrandId(value.getId()); + }); + SpringUtils.getBean(BrandExtendService.class).saveBatch(brandJsonBrandMap.keySet()); } /** @@ -50,9 +84,45 @@ public class CpopImportTests { * @return: void */ @Test - public void importStoreJson() { - + public void importStoreJson() throws IOException { + String brandFileUrl = "C:\\Users\\Administrator\\Desktop\\store.json"; + List filterList = new ArrayList<>(); + filterList.add("b00064a760d0c4f121b0835d09b909ca"); + filterList.add("ac1268b164d1d20700080aae1703ecf8"); + filterList.add("0122a5876468513f0d42569d389e8264"); + List jsonBrands = JSONArray.parseArray(readJson(brandFileUrl), JsonStore.class); + //过滤已存在的品牌 + List filterStore = jsonBrands.stream() + .filter(item -> !filterList.contains(item.getBrandCloudId()) && + //品牌不为null和空 + null != item.getBrandCloudId() && StringUtils.isNotBlank(item.getBrandCloudId())).collect(Collectors.toList()); + //打印 + Map storeExtendStoreMap = new HashMap<>(); + //获取所有品牌 + List brandRowList = DbChain.table(BRAND).select(BRAND.ID, BRAND_EXTEND.BRAND_CLOUD_ID) + .from(BRAND) + .leftJoin(BRAND_EXTEND).on(BRAND_EXTEND.BRAND_ID.eq(BRAND.ID)).list(); + Map brandCloudIdMap = brandRowList.stream().collect(Collectors.toMap(item -> item.getString("brandCloudId"), item -> item)); + filterStore.forEach(item -> { + //只插入能找到品牌的校区 + if (null != brandCloudIdMap.get(item.brandCloudId)){ + StoreExtend storeExtend = new StoreExtend(); + storeExtend.setStoreCloudId(item.getStoreCloudId()); + Store store = new Store(); + store.setSourceType(SourceType.JAMBOX.toString()) + .setStoreName(item.getName()) + .setBrandId(brandCloudIdMap.get(item.brandCloudId).getString("id")); + storeExtendStoreMap.put(storeExtend,store); + } + }); + //插入校区 + SpringUtils.getBean(StoreService.class).saveBatch(storeExtendStoreMap.values()); + storeExtendStoreMap.forEach((key, value) -> { + key.setStoreId(value.getId()); + }); + //插入拓展 + SpringUtils.getBean(StoreExtendService.class).saveBatch(storeExtendStoreMap.keySet()); } /** @@ -64,17 +134,42 @@ public class CpopImportTests { /** * 品牌名 */ - @JSONField(name = "") + @JSONField(name = "name") private String brandName; /** * 云品牌id */ - @JSONField(name = "") + @JSONField(name = "_id") private String brandCloudId; } + /** + * json格式店铺/校区 + */ + @Data + private class JsonStore implements Serializable { + + /** + * 校区名 + */ + @JSONField(name = "name") + private String name; + + /** + * 云校区id + */ + @JSONField(name = "_id") + private String storeCloudId; + + /** + * 云品牌id + */ + @JSONField(name = "_brandid") + private String brandCloudId; + } + /** * 读取json文件数据 * diff --git a/Cpop-Oam/pom.xml b/Cpop-Oam/pom.xml index 9833c32..d5c629c 100644 --- a/Cpop-Oam/pom.xml +++ b/Cpop-Oam/pom.xml @@ -41,6 +41,15 @@ com.github.binarywang weixin-java-open + + + org.springframework.boot + spring-boot-devtools + + true + + runtime + @@ -49,6 +58,7 @@ org.springframework.boot spring-boot-maven-plugin + true diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/PauseWorkOrderBo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/PauseWorkOrderBo.java index 1b52cf3..2058013 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/PauseWorkOrderBo.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/PauseWorkOrderBo.java @@ -6,32 +6,34 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; -import java.io.Serializable; import java.time.LocalDateTime; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; /** - * @author: DB - * @Date: 2023/07/12/12:00 - * @Description: + * 工单暂停请求对象 + * @author DB + * @since 2023-11-29 16:01:35 + * @version 1.0.0 */ @Data @Accessors(chain = true) -@ApiModel(value = "PauseWorkOrderBo对象", description = "") -public class PauseWorkOrderBo implements Serializable { - - private static final long serialVersionUID = 1L; +@ApiModel(value = "工单暂停请求对象") +public class PauseWorkOrderBo { /** * 工单id */ + @NotBlank(message = "工单id不能为空") @ApiModelProperty("工单id") - private String taskId; + private String workOrderId; /** * 暂停到时间 */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8") + @NotNull(message = "时间不能为空") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @ApiModelProperty("暂停到时间") - private LocalDateTime taskReceiptTime; + private LocalDateTime pauseExpireTime; } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskWorkOrderBo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskWorkOrderBo.java index 9fa28a7..8cab30e 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskWorkOrderBo.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskWorkOrderBo.java @@ -7,7 +7,7 @@ import lombok.experimental.Accessors; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; -import java.io.Serializable; +import com.cpop.core.annontation.StringArrayConvert; /** * 任务-工单表Bo @@ -18,7 +18,7 @@ import java.io.Serializable; @Data @Accessors(chain = true) @ApiModel(value = "TaskWorkOrder对象", description = "任务-工单表") -public class TaskWorkOrderBo implements Serializable { +public class TaskWorkOrderBo { private static final long serialVersionUID = 1L; @@ -32,35 +32,28 @@ public class TaskWorkOrderBo implements Serializable { * 品牌id */ @NotBlank(message = "品牌id不能为空") - @ApiModelProperty(value = "品牌id",required = true) + @ApiModelProperty(value = "品牌id", required = true) private String brandId; /** * 校区id */ - @NotBlank(message = "校区id不能为空") - @ApiModelProperty(value = "校区id",required = true) - private String campusId; - - /** - * 工单名 - */ - @NotBlank(message = "工单名不能为空") - @ApiModelProperty(value = "工单名",required = true) - private String taskName; + @NotBlank(message = "校区/店铺id不能为空") + @ApiModelProperty(value = "校区/店铺id", required = true) + private String storeId; /** * 工单内容 */ @NotBlank(message = "工单内容不能为空") - @ApiModelProperty(value = "工单内容",required = true) + @ApiModelProperty(value = "工单内容", required = true) private String taskContent; /** * 任务类型(0:迭代;1:需求;2:工单) */ @NotNull(message = "任务类型不能为空") - @ApiModelProperty(value = "任务类型(0:迭代;1:需求;2:工单)",required = true) + @ApiModelProperty(value = "任务类型(0:迭代;1:需求;2:工单)", required = true) private Integer taskType; /** @@ -72,6 +65,7 @@ public class TaskWorkOrderBo implements Serializable { /** * 附件地址 */ + @StringArrayConvert @ApiModelProperty("附件地址") private String attachmentUrl; diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskWorkOrderRecordBo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskWorkOrderRecordBo.java index 008fe26..f0507d1 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskWorkOrderRecordBo.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskWorkOrderRecordBo.java @@ -6,20 +6,17 @@ import lombok.Data; import lombok.experimental.Accessors; import javax.validation.constraints.NotBlank; -import java.io.Serializable; /** - * 任务-工单-记录表Bo - * - * @author DB.lost - * @since 2023-07-10 + * TaskWorkOrderRecord对象 + * @author DB + * @since 2023-11-29 11:32:51 + * @version 1.0.0 */ @Data @Accessors(chain = true) @ApiModel(value = "TaskWorkOrderRecord对象", description = "任务-工单-记录表") -public class TaskWorkOrderRecordBo implements Serializable { - - private static final long serialVersionUID = 1L; +public class TaskWorkOrderRecordBo { /** * 任务工单id diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/controller/backstage/TaskWorkOrderController.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/controller/backstage/TaskWorkOrderController.java index 68e9a5b..dd89c6e 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/controller/backstage/TaskWorkOrderController.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/controller/backstage/TaskWorkOrderController.java @@ -1,16 +1,22 @@ package com.cpop.oam.business.controller.backstage; import com.cpop.core.base.R; +import com.cpop.jambox.business.vo.BrandListVo; import com.cpop.oam.business.bo.PauseWorkOrderBo; import com.cpop.oam.business.bo.TaskWorkOrderBo; -import com.cpop.oam.business.bo.TaskWorkOrderPageBo; import com.cpop.oam.business.bo.TaskWorkOrderRecordBo; import com.cpop.oam.business.service.TaskWorkOrderService; +import com.cpop.oam.business.vo.StoreListVo; import com.cpop.oam.business.vo.TaskWorkOrderPageVo; +import com.cpop.oam.business.vo.TaskWorkOrderReceiveDealPauseVo; import com.cpop.oam.business.vo.TaskWorkOrderRecordListVo; +import com.cpop.oam.business.vo.WorkOrderDutyVo; +import com.cpop.system.business.service.BrandService; +import com.cpop.system.business.service.StoreService; import com.mybatisflex.core.paginate.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; @@ -18,106 +24,214 @@ import org.springframework.web.bind.annotation.*; import java.util.List; +import static com.cpop.system.business.entity.table.BrandTableDef.BRAND; +import static com.cpop.system.business.entity.table.StoreTableDef.STORE; + /** - * 任务-工单表 控制层。 - * + * 工单模块 * @author DB * @since 2023-09-18 */ @RestController -@Api(tags = "任务管理模块-工单管理") +@Api(tags = "工单模块") @RequestMapping("/taskWorkOrder") public class TaskWorkOrderController { @Autowired private TaskWorkOrderService taskWorkOrderService; + @Autowired + private BrandService brandService; + + @Autowired + private StoreService storeService; + /** - * @Description: 任务管理-工单管理-新增工单 - * @param bo 请求参数 - * @return: R - * @Author: DB - * @Date: 2023/5/30 16:53 + * 工单模块-工单提交-接收/处理/暂停中 + * @author DB + * @since 2023/09/18 17:18 + * @return com.cpop.core.base.R> + */ + @PreAuthorize("@aps.hasPermission('oamTask:workOrder:list')") + @ApiOperation("工单模块-工单提交-接收/处理/暂停中") + @GetMapping("/receiveDealPause") + public R receiveDealPause() { + TaskWorkOrderReceiveDealPauseVo vo = taskWorkOrderService.receiveDealPause(); + return R.ok(vo); + } + + /** + * 工单模块-工单提交-获取当天值班人员 + * @author DB + * @since 2023-11-29 14:01:03 + * @version 1.0.0 + */ + @PreAuthorize("@aps.hasPermission('oamTask:workOrder:list')") + @ApiOperation("工单模块-工单提交-获取当天值班人员") + @GetMapping("/getWorkOrderDutyStaff") + public R getWorkOrderDutyStaff() { + WorkOrderDutyVo vo = taskWorkOrderService.getWorkOrderDutyStaff(); + return R.ok(vo); + } + + /** + * 工单模块-工单提交-已办结分页列表 + * @author DB + * @since 2023-11-29 14:35:08 + * @version 1.0.0 + */ + @PreAuthorize("@aps.hasPermission('oamTask:workOrder:list')") + @ApiOperation("工单模块-工单提交-已办结分页列表") + @GetMapping("/finishWorkOrderPage") + public R> finishWorkOrderPage() { + Page page = taskWorkOrderService.finishWorkOrderPage(); + return R.ok(page); + } + + /** + * 工单模块-工单提交-新增工单 + * @param bo 请求参数 + * @return R + * @author DB + * @since 2023/5/30 16:53 **/ @PreAuthorize("@aps.hasPermission('oamTask:workOrder:insert')") - @ApiOperation("任务管理模块-工单管理-新增工单") + @ApiOperation("工单模块-工单提交-新增工单") @PostMapping("/insertWorkOrder") - public R insertWorkOrder(@RequestBody @Validated TaskWorkOrderBo bo) { + public R insertWorkOrder(@RequestBody @Validated + TaskWorkOrderBo bo) { taskWorkOrderService.insertWorkOrder(bo); return R.ok(); } /** - * @descriptions 查询任务-工单-记录表列表 + * 工单模块-工单提交-工单记录列表 * @author DB - * @date 2023/09/18 17:18 - * @param bo 请求参数 - * @return com.cpop.core.base.R> - */ - @ApiOperation("任务管理模块-工单-分页列表") - @PostMapping("/getWorkOrderPage") - public R> getWorkOrderPage(@RequestBody TaskWorkOrderPageBo bo) { - Page pageVo = taskWorkOrderService.getWorkOrderPage(bo); - return R.ok(pageVo); - } - - /** - * @descriptions 查询任务-工单记录-列表 - * @author DB - * @date 2023/09/18 17:19 - * @param workRecordId 工单记录id - * @return com.cpop.core.base.R> + * @param workOrderId 工单id + * @since 2023-11-29 11:25:28 + * @version 1.0.0 */ @PreAuthorize("@aps.hasPermission('oamTask:workOrder:record')") - @ApiOperation("任务管理模块-工单记录") - @GetMapping("/getWorkOrderRecordList/{workRecordId}") - public R> getWorkOrderRecordList(@PathVariable("workRecordId") String workRecordId) { - List list = taskWorkOrderService.getWorkOrderRecordList(workRecordId); + @ApiOperation("工单模块-工单提交-工单记录列表") + @GetMapping("/getWorkOrderRecordList/{workOrderId}") + public R> getWorkOrderRecordList(@PathVariable @ApiParam("工单id") + String workOrderId) { + List list = taskWorkOrderService.getWorkOrderRecordList(workOrderId); return R.ok(list); } /** - * @Description: 任务管理-工单管理-新增工单记录 + * 工单模块-工单提交-新增工单记录 + * @author DB * @param bo 请求参数 - * @return: R - * @Author: DB - * @Date: 2023/5/30 16:53 - **/ - @ApiOperation("任务管理模块-工单管理-新增工单记录") + * @since 2023-11-29 11:33:35 + * @version 1.0.0 + */ + @PreAuthorize("@aps.hasPermission('oamTask:workOrder:record')") + @ApiOperation("工单模块-工单提交-新增工单记录") @PostMapping("/insertWorkOrderRecord") - public R insertWorkOrderRecord(@RequestBody @Validated TaskWorkOrderRecordBo bo) { + public R insertWorkOrderRecord(@RequestBody @Validated + TaskWorkOrderRecordBo bo) { taskWorkOrderService.insertWorkOrderRecord(bo); return R.ok(); } /** - * @Description: 工单办结 - * @param id 主键 - * @return: R - * @Author: DB - * @Date: 2023/5/16 17:10 - **/ - @PreAuthorize("@aps.hasPermission('oamTask:workOrder:update')") - @ApiOperation("工单办结") - @PutMapping("/concludeWorkOrder/{id}") - public R concludeWorkOrder(@PathVariable("id") String id) { - taskWorkOrderService.concludeWorkOrder(id); + * 工单模块-工单提交-工单提醒 + * @author DB + * @param workOrderId 工单id + * @since 2023-11-29 11:41:46 + * @version 1.0.0 + */ + @PreAuthorize("@aps.hasPermission('oamTask:workOrder:record')") + @ApiOperation("工单模块-工单提交-工单提醒") + @PutMapping("/workOrderRemind/{workOrderId}") + public R workOrderRemind(@PathVariable @ApiParam("工单id") + String workOrderId) { + taskWorkOrderService.workOrderRemind(workOrderId); return R.ok(); } /** - * @Description: 工单暂停 - * @param bo 请求参数 - * @return: R - * @Author: DB - * @Date: 2023/5/16 17:10 - **/ + * 工单模块-工单提交-工单转需求 + * @author DB + * @param workOrderId 工单id + * @since 2023-11-29 12:30:21 + * @version 1.0.0 + */ + @Deprecated @PreAuthorize("@aps.hasPermission('oamTask:workOrder:update')") - @ApiOperation("工单暂停") + @ApiOperation("工单模块-工单提交-工单转需求") + @PutMapping("/workOrderToDemand/{workOrderId}") + public R workOrderToDemand(@PathVariable @ApiParam("工单id") + String workOrderId) { + taskWorkOrderService.workOrderToDemand(workOrderId); + return R.ok(); + } + + /** + * 工单模块-工单提交-工单暂停 + * @author DB + * @param bo 请求参数 + * @since 2023-11-29 16:00:18 + * @version 1.0.0 + */ + @PreAuthorize("@aps.hasPermission('oamTask:workOrder:update')") + @ApiOperation("工单模块-工单提交-工单暂停") @PutMapping("/pauseWorkOrder") - public R pauseWorkOrder(@RequestBody PauseWorkOrderBo bo) { + public R pauseWorkOrder(@RequestBody @Validated + PauseWorkOrderBo bo) { taskWorkOrderService.pauseWorkOrder(bo); return R.ok(); } + /** + * 工单模块-工单提交-工单办结 + * @author DB + * @param workOrderId 工单id + * @since 2023-11-29 15:44:08 + * @version 1.0.0 + */ + @PreAuthorize("@aps.hasPermission('oamTask:workOrder:update')") + @ApiOperation("工单模块-工单提交-工单办结") + @PutMapping("/workOrderFinish/{workOrderId}") + public R workOrderFinish(@PathVariable("workOrderId") @ApiParam("工单id") + String workOrderId) { + taskWorkOrderService.workOrderFinish(workOrderId); + return R.ok(); + } + + /** + * @descriptions 任务管理模块-工单管理-获取品牌列表 + * @author DB + * @date 2023/11/28 12:34 + * @param brandName + * 品牌名 + * @return: com.cpop.core.base.R> + */ + @ApiOperation("工单模块-工单提交-获取品牌列表") + @GetMapping("/getBrandList") + public R> getBrandList(@ApiParam("品牌名") + String brandName) { + List list = + brandService.queryChain().and(BRAND.BRAND_NAME.like(brandName)).listAs(BrandListVo.class); + return R.ok(list); + } + + /** + * @descriptions 任务管理模块-工单管理-获取校区/店铺列表 + * @author DB + * @date 2023/11/28 12:38 + * @param brandId + * 品牌id + * @return: com.cpop.core.base.R> + */ + @ApiOperation("工单模块-工单提交-获取校区/店铺列表") + @GetMapping("/getStoreList") + public R> getStoreList(@ApiParam("品牌id") + String brandId) { + List list = storeService.queryChain().and(STORE.BRAND_ID.eq(brandId)).listAs(StoreListVo.class); + return R.ok(list); + } + } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/dto/TaskWorkOrderReceiveDealPauseDto.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/dto/TaskWorkOrderReceiveDealPauseDto.java index bc79133..df0f6da 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/dto/TaskWorkOrderReceiveDealPauseDto.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/dto/TaskWorkOrderReceiveDealPauseDto.java @@ -1,7 +1,103 @@ -package com.cpop.oam.business.dto;/** +package com.cpop.oam.business.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** * @author DB * @createTime 2023/11/28 15:42 - * @description + * @description */ -public class TaskWorkOrderReceiveDealPauseDto { +@Data +public class TaskWorkOrderReceiveDealPauseDto implements Serializable { + + /** + * 主键 + */ + private String id; + + /** + * 任务状态 + */ + private Integer taskStatus; + + /** + * 机构/品牌 + */ + private String brandName; + + /** + * 校区/店铺 + */ + private String storeName; + + /** + * 问题描述 + */ + private String taskContent; + + /** + * 手机号 + */ + private String phoneNumber; + + /** + * 提交员工di + */ + private String recordStaffId; + + /** + * 提交人 + */ + private String recordStaffName; + + /** + * 提交时间 + */ + private LocalDateTime createTime; + + /** + * 接收员工id + */ + private String responsibleStaffId; + + /** + * 接收人 + */ + private String responsibleStaffName; + + /** + * 任务接收时间 + */ + private LocalDateTime taskReceiptTime; + + /** + * 任务接收用时/min + */ + private Integer receivingTime; + + /** + * 暂停员工id + */ + private String pauseStaffId; + + /** + * 暂停员工 + */ + private String pauseStaffName; + + /** + * 暂停记录时间 + */ + private LocalDateTime pauseRecordTime; + + /** + * 暂停到期时间 + */ + private LocalDateTime pauseExpireTime; + } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/Task.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/Task.java index 4b12c82..a23d004 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/Task.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/Task.java @@ -20,7 +20,7 @@ import java.time.LocalDateTime; * @since 2023-09-15 */ @Data -@EqualsAndHashCode(callSuper=false) +@EqualsAndHashCode(callSuper = false) @Builder @NoArgsConstructor @AllArgsConstructor @@ -40,7 +40,7 @@ public class Task extends BaseEntity implements Serializable { private String taskName; /** - * 任务类型(0:迭代;1:需求;2:工单) + * 任务类型(0:迭代;1:需求;2:投诉/工单) */ private Integer taskType; @@ -50,7 +50,7 @@ public class Task extends BaseEntity implements Serializable { private String responsibleStaffId; /** - * 任务状态(-1:失败;0:待审核;1:待接受;2:进行中;3:已完成;4:逾期;5:暂停;6:逾期完成) + * 任务状态(-1:失败;0:待审核;1:待接受;2:进行中;3:已完成;4:逾期;5:暂停;6:逾期完成;7:接收超时) */ private Integer taskStatus; diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/TaskWorkOrder.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/TaskWorkOrder.java index 248ce83..c09e404 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/TaskWorkOrder.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/TaskWorkOrder.java @@ -19,7 +19,7 @@ import java.time.LocalDateTime; * @since 2023-09-18 */ @Data -@EqualsAndHashCode(callSuper=false) +@EqualsAndHashCode(callSuper = false) @Builder @NoArgsConstructor @AllArgsConstructor @@ -44,9 +44,9 @@ public class TaskWorkOrder extends BaseEntity implements Serializable { private String brandId; /** - * 校区id + * 校区店铺id */ - private String campusId; + private String storeId; /** * 产品id @@ -68,9 +68,30 @@ public class TaskWorkOrder extends BaseEntity implements Serializable { */ private LocalDateTime finishTime; + /** + * 办结员工id + */ + private String finishStaffId; + /** + * 接收用时 + */ + private Integer receivingTime; + /** + * 暂停员工 + */ + private String pauseStaffId; + /** + * 暂停记录时间 + */ + private LocalDateTime pauseRecordTime; + + /** + * 暂停到期时间 + */ + private LocalDateTime pauseExpireTime; /** * 是否删除(0否1是) diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/TaskWorkOrderService.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/TaskWorkOrderService.java index 81a1ee6..fb2877c 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/TaskWorkOrderService.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/TaskWorkOrderService.java @@ -1,10 +1,11 @@ package com.cpop.oam.business.service; +import com.cpop.oam.business.vo.TaskWorkOrderReceiveDealPauseVo; +import com.cpop.oam.business.vo.WorkOrderDutyVo; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.service.IService; import com.cpop.oam.business.bo.PauseWorkOrderBo; import com.cpop.oam.business.bo.TaskWorkOrderBo; -import com.cpop.oam.business.bo.TaskWorkOrderPageBo; import com.cpop.oam.business.bo.TaskWorkOrderRecordBo; import com.cpop.oam.business.entity.TaskWorkOrder; import com.cpop.oam.business.vo.TaskWorkOrderPageVo; @@ -21,56 +22,90 @@ import java.util.List; public interface TaskWorkOrderService extends IService { /** - * @Description: 任务管理-工单管理-新增工单 - * @param bo 请求参数 - * @return: R - * @Author: DB - * @Date: 2023/5/30 16:53 + * 工单模块-工单提交-接收/处理/暂停中 + * @author DB + * @since 2023/09/18 17:18 + * @return com.cpop.core.base.R> + */ + TaskWorkOrderReceiveDealPauseVo receiveDealPause(); + + /** + * 工单模块-工单提交-获取当天值班人员 + * @author DB + * @since 2023-11-29 14:01:03 + * @version 1.0.0 + */ + WorkOrderDutyVo getWorkOrderDutyStaff(); + + /** + * 工单模块-工单提交-已办结分页列表 + * @author DB + * @since 2023-11-29 14:35:08 + * @version 1.0.0 + */ + Page finishWorkOrderPage(); + + /** + * 工单模块-工单提交-新增工单 + * @param bo 请求参数 + * @return R + * @author DB + * @since 2023/5/30 16:53 **/ void insertWorkOrder(TaskWorkOrderBo bo); /** - * @descriptions 查询任务-工单-记录表列表 + * 工单模块-工单提交-工单记录列表 * @author DB - * @date 2023/09/18 17:18 - * @param bo 请求参数 - * @return com.cpop.core.base.R> + * @param workOrderId 工单id + * @since 2023-11-29 11:25:28 + * @version 1.0.0 */ - Page getWorkOrderPage(TaskWorkOrderPageBo bo); + List getWorkOrderRecordList(String workOrderId); /** - * @descriptions 查询任务-工单记录-列表 + * 工单模块-工单提交-新增工单记录 * @author DB - * @date 2023/09/18 17:19 - * @param workRecordId 工单记录id - * @return com.cpop.core.base.R> - */ - List getWorkOrderRecordList(String workRecordId); - - /** - * @Description: 任务管理-工单管理-新增工单记录 * @param bo 请求参数 - * @return: R - * @Author: DB - * @Date: 2023/5/30 16:53 - **/ + * @since 2023-11-29 11:33:35 + * @version 1.0.0 + */ void insertWorkOrderRecord(TaskWorkOrderRecordBo bo); /** - * @Description: 工单办结 - * @param id 主键 - * @return: R - * @Author: DB - * @Date: 2023/5/16 17:10 - **/ - void concludeWorkOrder(String id); + * 工单模块-工单提交-工单提醒 + * @author DB + * @param workOrderId 工单id + * @since 2023-11-29 11:41:46 + * @version 1.0.0 + */ + void workOrderRemind(String workOrderId); /** - * @Description: 工单暂停 + * 工单模块-工单提交-工单转需求 + * @author DB + * @param workOrderId 工单id + * @since 2023-11-29 12:30:21 + * @version 1.0.0 + */ + void workOrderToDemand(String workOrderId); + + /** + * 工单模块-工单提交-工单暂停 + * @author DB * @param bo 请求参数 - * @return: R - * @Author: DB - * @Date: 2023/5/16 17:10 - **/ + * @since 2023-11-29 16:00:18 + * @version 1.0.0 + */ void pauseWorkOrder(PauseWorkOrderBo bo); + + /** + * 工单模块-工单提交-工单办结 + * @author DB + * @param workOrderId 工单id + * @since 2023-11-29 15:44:08 + * @version 1.0.0 + */ + void workOrderFinish(String workOrderId); + } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskWorkOrderServiceImpl.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskWorkOrderServiceImpl.java index af33880..7a25a01 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskWorkOrderServiceImpl.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskWorkOrderServiceImpl.java @@ -1,6 +1,12 @@ package com.cpop.oam.business.service.impl; import com.alibaba.fastjson.JSONObject; +import com.cpop.common.utils.StringUtils; +import com.cpop.core.base.entity.PageDomain; +import com.cpop.oam.business.dto.TaskWorkOrderReceiveDealPauseDto; +import com.cpop.oam.business.vo.TaskWorkOrderReceiveDealPauseVo; +import com.cpop.oam.business.vo.WorkOrderDutyVo; +import com.cpop.oam.framework.tasks.WorkOrderAcceptOverTimeTask; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; @@ -8,7 +14,6 @@ import com.cpop.api.tencent.wxWork.handler.WebHookSendHandler; import com.cpop.common.utils.DateUtils; import com.cpop.common.utils.bean.BeanUtils; import com.cpop.core.base.entity.LoginUser; -import com.cpop.core.base.entity.PageDomain; import com.cpop.core.base.entity.loginInfo.OamStaffLoginInfo; import com.cpop.core.base.enums.UserType; import com.cpop.core.base.exception.ServiceException; @@ -16,12 +21,9 @@ import com.cpop.core.service.RedisService; 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.TaskWorkOrderBo; -import com.cpop.oam.business.bo.TaskWorkOrderPageBo; import com.cpop.oam.business.bo.TaskWorkOrderRecordBo; -import com.cpop.oam.business.dto.TaskWorkOrderRecordDto; import com.cpop.oam.business.entity.*; import com.cpop.oam.business.mapper.TaskWorkOrderMapper; import com.cpop.oam.business.service.*; @@ -31,6 +33,7 @@ import com.cpop.oam.business.vo.TaskWorkOrderRecordListVo; import com.cpop.oam.framework.constant.WebHookKeyConstant; import com.cpop.oam.framework.enums.QuartzEnums; import com.cpop.oam.framework.tasks.WorkOrderOvertimeTask; +import lombok.extern.slf4j.Slf4j; import org.quartz.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -42,6 +45,8 @@ import java.text.ParseException; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -54,6 +59,7 @@ import static com.cpop.oam.business.entity.table.TaskWorkOrderRecordTableDef.TAS import static com.cpop.oam.business.entity.table.TaskWorkOrderTableDef.TASK_WORK_ORDER; import static com.cpop.system.business.entity.table.BrandTableDef.BRAND; import static com.cpop.system.business.entity.table.StoreTableDef.STORE; +import com.cpop.core.utils.sql.SqlUtils; /** * 任务-工单表 服务层实现。 @@ -61,241 +67,506 @@ import static com.cpop.system.business.entity.table.StoreTableDef.STORE; * @author DB * @since 2023-09-18 */ +@Slf4j @Service("taskWorkOrderService") -public class TaskWorkOrderServiceImpl extends ServiceImpl implements TaskWorkOrderService { +public class TaskWorkOrderServiceImpl extends ServiceImpl + implements TaskWorkOrderService { @Autowired private Scheduler scheduler; /** - * @param bo 请求参数 - * @Description: 任务管理-工单管理-新增工单 - * @return: R - * @Author: DB - * @Date: 2023/5/30 16:53 + * 工单模块-工单提交-接收/处理/暂停中 + * @author DB + * @since 2023/09/18 17:18 + * @return com.cpop.core.base.R> + */ + @Override + public TaskWorkOrderReceiveDealPauseVo receiveDealPause() { + // 获取工单 + List dtoList = this.mapper.selectListByQueryAs(QueryWrapper.create() + // 工单 + .select(TASK_WORK_ORDER.ID, + TASK_WORK_ORDER.PHONE_NUMBER, + TASK_WORK_ORDER.RECORD_STAFF_ID, + TASK_WORK_ORDER.CREATE_TIME.as("createTime"), + TASK_WORK_ORDER.RECEIVING_TIME, + TASK_WORK_ORDER.PAUSE_STAFF_ID, + TASK_WORK_ORDER.PAUSE_RECORD_TIME, + TASK_WORK_ORDER.PAUSE_EXPIRE_TIME) + // 任务 + .select(TASK.TASK_CONTENT, TASK.TASK_STATUS, TASK.RESPONSIBLE_STAFF_ID, TASK.TASK_RECEIPT_TIME) + // 品牌 + .select(BRAND.BRAND_NAME) + // 校区 + .select(STORE.STORE_NAME) + .from(TASK_WORK_ORDER) + .leftJoin(TASK) + .on(TASK.ID.eq(TASK_WORK_ORDER.TASK_ID)) + .leftJoin(BRAND) + .on(BRAND.ID.eq(TASK_WORK_ORDER.BRAND_ID)) + .leftJoin(STORE) + .on(STORE.ID.eq(TASK_WORK_ORDER.STORE_ID)) + // 工单 + .where(TASK.TASK_TYPE.eq(2)) + .and(TASK.TASK_STATUS.in(1, 2, 4, 5, 7)), + TaskWorkOrderReceiveDealPauseDto.class, + // 提交人 + item -> item.field(TaskWorkOrderReceiveDealPauseDto::getRecordStaffName) + .queryWrapper(recordStaff -> queryChain().select(STAFF.NAME.as("recordStaffName")) + .from(STAFF) + .where(STAFF.ID.eq(recordStaff.getRecordStaffId()))), + // 负责人 + item -> item.field(TaskWorkOrderReceiveDealPauseDto::getResponsibleStaffName) + .queryWrapper(responsibleStaff -> queryChain().select(STAFF.NAME.as("responsibleStaffName")) + .from(STAFF) + .where(STAFF.ID.eq(StringUtils.isNotBlank(responsibleStaff.getResponsibleStaffId()) + ? responsibleStaff.getResponsibleStaffId() + : "-1"))), + // 暂停人 + item -> item.field(TaskWorkOrderReceiveDealPauseDto::getPauseStaffName) + .queryWrapper(pauseStaff -> queryChain().select(STAFF.NAME.as("pauseStaffName")) + .from(STAFF) + .where(STAFF.ID.eq( + StringUtils.isNotBlank(pauseStaff.getPauseStaffId()) ? pauseStaff.getPauseStaffId() : "-1")))); + // 分组过滤 + Map> taskStatusMap = + dtoList.stream().collect(Collectors.groupingBy(TaskWorkOrderReceiveDealPauseDto::getTaskStatus)); + TaskWorkOrderReceiveDealPauseVo taskWorkOrderReceiveDealPauseVo = new TaskWorkOrderReceiveDealPauseVo(); + taskStatusMap.forEach((key, value) -> { + switch (key) { + // 待接收 + case 1: + // 接收逾期 + case 7: + List receiveList = + BeanUtils.mapToList(taskStatusMap.get(key), TaskWorkOrderReceiveDealPauseVo.Receive.class); + if (taskWorkOrderReceiveDealPauseVo.getReceiveList() == null) { + taskWorkOrderReceiveDealPauseVo.setReceiveList(receiveList); + } else { + taskWorkOrderReceiveDealPauseVo.getReceiveList().addAll(receiveList); + } + break; + // 进行中 + case 2: + // 逾期 + case 4: + List dealList = + BeanUtils.mapToList(taskStatusMap.get(key), TaskWorkOrderReceiveDealPauseVo.Deal.class); + if (taskWorkOrderReceiveDealPauseVo.getDealList() == null) { + taskWorkOrderReceiveDealPauseVo.setDealList(dealList); + } else { + taskWorkOrderReceiveDealPauseVo.getDealList().addAll(dealList); + } + break; + default: + // 暂停中 + List pauseList = + BeanUtils.mapToList(taskStatusMap.get(key), TaskWorkOrderReceiveDealPauseVo.Pause.class); + taskWorkOrderReceiveDealPauseVo.setPauseList(pauseList); + } + }); + return taskWorkOrderReceiveDealPauseVo; + } + + /** + * 工单模块-工单提交-获取当天值班人员 + * @author DB + * @since 2023-11-29 14:01:03 + * @version 1.0.0 + */ + @Override + public WorkOrderDutyVo getWorkOrderDutyStaff() { + return SpringUtils.getBean(DutyService.class) + .getMapper() + .selectOneWithRelationsByQueryAs( + QueryWrapper.create() + .select(DUTY.SERVICE_STAFF_ID, DUTY.TECHNOLOGY_STAFF_ID, DUTY.DUTY_DATE) + .from(DUTY) + .where(DUTY.DUTY_DATE.eq(DateUtils.getDate())), + WorkOrderDutyVo.class); + } + + /** + * 工单模块-工单提交-已办结分页列表 + * @author DB + * @since 2023-11-29 14:35:08 + * @version 1.0.0 + */ + @Override + public Page finishWorkOrderPage() { + PageDomain pageDomain = SqlUtils.getInstance().getPageDomain(); + return this.mapper.paginateAs(Page.of(pageDomain.getPageNum(), pageDomain.getPageSize()), + QueryWrapper.create() + .select(TASK_WORK_ORDER.FINISH_STAFF_ID, TASK_WORK_ORDER.FINISH_TIME) + .select(TASK.TASK_CONTENT) + .from(TASK_WORK_ORDER) + .leftJoin(TASK) + .on(TASK.ID.eq(TASK_WORK_ORDER.TASK_ID)) + // 工单 + .where(TASK.TASK_TYPE.eq(2)) + .and(TASK.TASK_STATUS.in(3, 6)), + TaskWorkOrderPageVo.class, + item -> item.field(TaskWorkOrderPageVo::getFinishStaffName) + .queryWrapper(finishStaff -> queryChain().select(STAFF.NAME.as("finishStaffName")) + .from(STAFF) + .where(STAFF.ID.eq(finishStaff.getFinishStaffId())))); + } + + /** + * 工单模块-工单提交-新增工单 + * @param bo 请求参数 + * @return R + * @author DB + * @since 2023/5/30 16:53 **/ @Override @Transactional(rollbackFor = Exception.class) public void insertWorkOrder(TaskWorkOrderBo bo) { - //添加任务 - Task task = new Task(); - BeanUtils.copyBeanProp(task, bo); - //默认待接受 - task.setTaskStatus(2) - //默认开发中 - .setTaskItem(0) - .setTaskWeight(10) - //工单不参与评级 - .setTaskRating(-1) - .setTaskReceiptTime(LocalDateTime.now()); - //获取值班员工 + // 获取值班员工 DutyService dutyService = SpringUtils.getBean(DutyService.class); Duty duty = dutyService.getOne(QueryWrapper.create().where(DUTY.DUTY_DATE.eq(DateUtils.getDate()))); - if (null == duty) { + if (duty == null) { throw new ServiceException("当天没有值班员工,请联系相关人员添加值班信息!"); } - task.setResponsibleStaffId(duty.getTechnologyStaffId()); + // 添加任务 + Task task = new Task(); + BeanUtils.copyBeanProp(task, bo); + // 默认待接受 + task.setTaskStatus(1) + .setTaskName("工单") + // 默认开发中 + .setTaskItem(0) + .setTaskWeight(10) + // 工单不参与评级 + .setTaskRating(-1); TaskService taskService = SpringUtils.getBean(TaskService.class); - task.setExpectedCompletionDate(Date.valueOf(LocalDate.now())); taskService.save(task); - //添加工单绩点 - TaskStaffGroupService staffGroupService = SpringUtils.getBean(TaskStaffGroupService.class); - TaskStaffGroup taskStaffGroup = new TaskStaffGroup(); - taskStaffGroup.setStaffId(duty.getTechnologyStaffId()) - .setTaskId(task.getId()) - .setGradePoint(0); - staffGroupService.save(taskStaffGroup); - //添加工单 + // 添加工单 TaskWorkOrder entity = new TaskWorkOrder(); BeanUtils.copyBeanProp(entity, bo); entity.setTaskId(task.getId()); - //当前操作员工是否是主要负责人,不是抛出异常 - LoginUser loginUser = SecurityUtils.getInstance().getLoginUser(); - //读取员工信息 - RedisService redisService = SpringUtils.getBean(RedisService.class); - JSONObject cacheObject = redisService.getCacheObject(UserType.OAM_USER.getKey() + loginUser.getUsername()); - OamStaffLoginInfo loginInfo = cacheObject.getJSONObject("user").toJavaObject(OamStaffLoginInfo.class); - entity.setRecordStaffId(loginInfo.getId()); + // 读取员工信息 + JSONObject loginUserInfo = SecurityUtils.getInstance().getLoginUserInfo(); + entity.setRecordStaffId(loginUserInfo.getString("id")); this.save(entity); - //通知值班员工 + // 添加一个0绩点 + TaskStaffGroupService taskStaffGroupService = SpringUtils.getBean(TaskStaffGroupService.class); + TaskStaffGroup taskStaffGroup = new TaskStaffGroup(); + taskStaffGroup.setTaskId(task.getId()).setStaffId(duty.getTechnologyStaffId()).setGradePoint(0); + taskStaffGroupService.save(taskStaffGroup); + // 通知值班员工 StaffService staffService = SpringUtils.getBean(StaffService.class); StaffInfoVo technologyStaffInfo = staffService.getStaffInfo(duty.getTechnologyStaffId()); - if (null != technologyStaffInfo) { - //企微通知值班人员 + if (technologyStaffInfo != null) { + // 企微通知值班人员 List phoneList = new ArrayList(); phoneList.add(technologyStaffInfo.getPhoneNumber()); try { - SpringUtils.getBean(WebHookSendHandler.class).webHookSendText(WebHookKeyConstant.ORDER_INFO_BOT, phoneList, "==========您有一条新的工单需要处理==========", false); + SpringUtils.getBean(WebHookSendHandler.class) + .webHookSendText(WebHookKeyConstant.ORDER_INFO_BOT, + phoneList, + "==========您有一条新的工单需要处理==========" + "\n" + task.getTaskName() + "\n" + task.getTaskContent(), + false); } catch (IOException e) { throw new ServiceException("发送消息通知失败!"); } - //添加工单记录 - TaskWorkOrderRecordDto orderRecordDto = new TaskWorkOrderRecordDto(); - orderRecordDto.setRecordStaffId(loginInfo.getId()) - .setTaskWorkOrderId(entity.getId()) - .setRecordText(bo.getTaskContent()) - .setAttachmentUrl(bo.getAttachmentUrl()) - .setRecordStaffPhone(loginInfo.getPhoneNumber()) - .setResponsibleStaffPhone(technologyStaffInfo.getPhoneNumber()); - SpringUtils.getBean(TaskWorkOrderRecordService.class).insertTaskWorkOrderRecord(orderRecordDto); } - //添加逾期检查任务 - startOrUpdateWorkOrderOvertimeTask(entity.getId(), false, Date.valueOf(LocalDate.now())); + // 添加未接收任务 + startOrRemoveWorkOrderAcceptTask(entity.getId(), true, LocalDateTime.now()); } /** - * @param workOrderId 工单id - * @param isUpdate 是否更新 - * @param date 开始时间 - * @Description: 生成工单超时任务 + * 开始或删除工单接收任务 * @author DB - * @Date: 2023/7/13 0013 9:23 + * @param workOrderId 工单id + * @param isStart 是否是开始标识 + * @param dateTime 时间 + * @since 2023-11-29 10:21:02 + * @version 1.0.0 */ - private void startOrUpdateWorkOrderOvertimeTask(String workOrderId, Boolean isUpdate, Date date) { + private void startOrRemoveWorkOrderAcceptTask(String workOrderId, Boolean isStart, LocalDateTime dateTime) { // 基于表达式构建触发器 QuartzUtils quartzUtils = SpringUtils.getBean(QuartzUtils.class); try { - String cron = quartzUtils.convertToCron(DateUtils.addDateHours(date, 2)); - if (isUpdate) { - quartzUtils.modifyJob(QuartzEnums.WORK_ORDER_OVERTIME_TASK.getName() + workOrderId, - QuartzEnums.WORK_ORDER_OVERTIME_TASK.getGroup(), cron); - } else { + QuartzEnums acceptEnums = QuartzEnums.WORK_ORDER_ACCEPT_OVERTIME_TASK; + // 开始 + if (isStart) { + // 未接收半小时后触发 + LocalDateTime localDateTime = dateTime.plusMinutes(30); + ZoneId zoneId = ZoneId.systemDefault(); + String cron = quartzUtils.convertToCron(Date.from(localDateTime.atZone(zoneId).toInstant())); // 通过JobBuilder构建JobDetail实例,JobDetail规定其job只能是实现Job接口的实例 - JobDetail jobDetail = JobBuilder.newJob(WorkOrderOvertimeTask.class).withIdentity(QuartzEnums.WORK_ORDER_OVERTIME_TASK.getName() + workOrderId, - QuartzEnums.WORK_ORDER_OVERTIME_TASK.getGroup()) - .usingJobData("WorkOrderId", workOrderId) - .build(); + JobDetail jobDetail = JobBuilder.newJob(WorkOrderAcceptOverTimeTask.class) + .withIdentity(acceptEnums.getName() + workOrderId, acceptEnums.getGroup()) + .usingJobData("WorkOrderId", workOrderId) + .build(); CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron); // CronTrigger表达式触发器 继承于Trigger。TriggerBuilder 用于构建触发器实例 - CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(QuartzEnums.WORK_ORDER_OVERTIME_TASK.getName() + workOrderId, - QuartzEnums.WORK_ORDER_OVERTIME_TASK.getGroup()) - .withSchedule(cronScheduleBuilder).build(); + 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 + * @param workOrderId 工单id + * @param isUpdate 是否更新 + * @param dateTime 开始时间 + * @since 2023-11-29 16:09:02 + * @version 1.0.0 + */ + private void startOrUpdateWorkOrderOvertimeTask(String workOrderId, Boolean isUpdate, LocalDateTime dateTime) { + // 基于表达式构建触发器 + QuartzUtils quartzUtils = SpringUtils.getBean(QuartzUtils.class); + try { + LocalDateTime localDateTime = dateTime.plusHours(2); + ZoneId zoneId = ZoneId.systemDefault(); + String cron = quartzUtils.convertToCron(Date.from(localDateTime.atZone(zoneId).toInstant())); + if (isUpdate) { + quartzUtils.modifyJob(QuartzEnums.WORK_ORDER_OVERTIME_TASK.getName() + workOrderId, + QuartzEnums.WORK_ORDER_OVERTIME_TASK.getGroup(), + cron); + } else { + // 通过JobBuilder构建JobDetail实例,JobDetail规定其job只能是实现Job接口的实例 + JobDetail jobDetail = JobBuilder.newJob(WorkOrderOvertimeTask.class) + .withIdentity(QuartzEnums.WORK_ORDER_OVERTIME_TASK.getName() + workOrderId, + QuartzEnums.WORK_ORDER_OVERTIME_TASK.getGroup()) + .usingJobData("WorkOrderId", workOrderId) + .build(); + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // CronTrigger表达式触发器 继承于Trigger。TriggerBuilder 用于构建触发器实例 + CronTrigger cronTrigger = TriggerBuilder.newTrigger() + .withIdentity(QuartzEnums.WORK_ORDER_OVERTIME_TASK.getName() + workOrderId, + QuartzEnums.WORK_ORDER_OVERTIME_TASK.getGroup()) + .withSchedule(cronScheduleBuilder) + .build(); scheduler.scheduleJob(jobDetail, cronTrigger); } } catch (SchedulerException | ParseException e) { + log.error(e.getMessage()); throw new ServiceException("生成工单超时任务失败!"); } } /** - * @param bo 请求参数 - * @return com.cpop.core.base.R> - * @descriptions 查询任务-工单-记录表列表 + * 工单模块-工单提交-工单记录列表 * @author DB - * @date 2023/09/18 17:18 + * @param workOrderId 工单id + * @since 2023-11-29 11:25:28 + * @version 1.0.0 */ @Override - public Page getWorkOrderPage(TaskWorkOrderPageBo bo) { - //重新定义列表 - PageDomain pageDomain = SqlUtils.getInstance().getPageDomain(); - return this.mapper.paginateAs(pageDomain.getPageNum(), pageDomain.getPageSize(), - QueryWrapper.create().select(TASK_WORK_ORDER.ALL_COLUMNS) - .select(TASK.TASK_NAME.as(TaskWorkOrderPageVo::getTaskName), TASK.TASK_CONTENT.as(TaskWorkOrderPageVo::getTaskContent), TASK.TASK_STATUS.as(TaskWorkOrderPageVo::getTaskStatus), - TASK.ATTACHMENT_URL.as(TaskWorkOrderPageVo::getAttachmentUrl), TASK.RESPONSIBLE_STAFF_ID.as(TaskWorkOrderPageVo::getResponsibleStaffId), - TASK.RESPONSIBLE_STAFF_ID.as(TaskWorkOrderPageVo::getResponsibleStaffId)) - .select(STAFF.NAME.as(TaskWorkOrderPageVo::getRecordStaffId)) - .select(BRAND.BRAND_NAME.as(TaskWorkOrderPageVo::getBrandName)) - .select(STORE.STORE_NAME.as(TaskWorkOrderPageVo::getCampusName)) - .select("rs.name as responsibleStaffName") - .from(TASK_WORK_ORDER) - //任务表 - .leftJoin(TASK).on(TASK.ID.eq(TASK_WORK_ORDER.TASK_ID)) - //小区表 - .leftJoin(STORE).on(STORE.ID.eq(TASK_WORK_ORDER.CAMPUS_ID)) - //品牌表 - .leftJoin(BRAND).on(BRAND.ID.eq(STORE.BRAND_ID)) - //员工表 - .leftJoin(STAFF).on(STAFF.ID.eq(TASK_WORK_ORDER.RECORD_STAFF_ID)) - .leftJoin(STAFF).as("rs").on("rs.id = cp_oam_task.responsible_staff_id") - .and(TASK.TASK_NAME.like(bo.getTaskName())) - .and(TASK.TASK_STATUS.eq(bo.getTaskStatus())) - .and(STORE.STORE_NAME.like(bo.getCampusName())), - TaskWorkOrderPageVo.class); + public List getWorkOrderRecordList(String workOrderId) { + // 根据任务id获取列表 + return SpringUtils.getBean(TaskWorkOrderRecordService.class) + .listAs( + QueryWrapper.create() + .select(TASK_WORK_ORDER_RECORD.ALL_COLUMNS) + .select(STAFF.NAME.as(TaskWorkOrderRecordListVo::getRecordStaffName)) + .select(SYS_USER.AVATAR.as(TaskWorkOrderRecordListVo::getAvatar)) + .from(TASK_WORK_ORDER_RECORD) + // 员工表 + .leftJoin(STAFF) + .on(STAFF.ID.eq(TASK_WORK_ORDER_RECORD.RECORD_STAFF_ID)) + // 系统用户表 + .leftJoin(SYS_USER) + .on(SYS_USER.ID.eq(STAFF.USER_ID)) + .where(TASK_WORK_ORDER_RECORD.TASK_WORK_ORDER_ID.eq(workOrderId)) + .orderBy(TASK_WORK_ORDER_RECORD.CREATE_TIME.asc()), + TaskWorkOrderRecordListVo.class); } /** - * @param workRecordId 工单记录id - * @return com.cpop.core.base.R> - * @descriptions 查询任务-工单记录-列表 + * 工单模块-工单提交-新增工单记录 * @author DB - * @date 2023/09/18 17:19 - */ - @Override - public List getWorkOrderRecordList(String workRecordId) { - //根据任务id获取列表 - return SpringUtils.getBean(TaskWorkOrderRecordService.class).listAs(QueryWrapper.create() - .select(TASK_WORK_ORDER_RECORD.ALL_COLUMNS) - .select(STAFF.NAME.as(TaskWorkOrderRecordListVo::getRecordStaffName)) - .select(SYS_USER.AVATAR.as(TaskWorkOrderRecordListVo::getAvatar)) - .from(TASK_WORK_ORDER_RECORD) - //员工表 - .leftJoin(STAFF).on(STAFF.ID.eq(TASK_WORK_ORDER_RECORD.RECORD_STAFF_ID)) - //系统用户表 - .leftJoin(SYS_USER).on(SYS_USER.ID.eq(STAFF.USER_ID)) - .where(TASK_WORK_ORDER_RECORD.TASK_WORK_ORDER_ID.eq(workRecordId)) - .orderBy(TASK_WORK_ORDER_RECORD.CREATE_TIME.asc()) - , TaskWorkOrderRecordListVo.class); - } - - /** * @param bo 请求参数 - * @Description: 任务管理-工单管理-新增工单记录 - * @return: R - * @Author: DB - * @Date: 2023/5/30 16:53 - **/ + * @since 2023-11-29 11:33:35 + * @version 1.0.0 + */ @Override public void insertWorkOrderRecord(TaskWorkOrderRecordBo bo) { - //获取工单信息 + // 获取工单信息 TaskWorkOrder taskWorkOrder = this.getById(bo.getTaskWorkOrderId()); - //获取任务信息 + // 获取任务信息 TaskService taskService = SpringUtils.getBean(TaskService.class); Task task = taskService.getOne(QueryWrapper.create().where(TASK.ID.eq(taskWorkOrder.getTaskId()))); - //插入工单记录 + // 插入工单记录 TaskWorkOrderRecord taskWorkOrderRecord = BeanUtils.mapToClass(bo, TaskWorkOrderRecord.class); - //获取记录员工 - //当前操作员工是否是主要负责人,不是抛出异常 + // 获取记录员工;当前操作员工是否是主要负责人,不是抛出异常 LoginUser loginUser = SecurityUtils.getInstance().getLoginUser(); - //读取员工信息 + // 读取员工信息 RedisService redisService = SpringUtils.getBean(RedisService.class); JSONObject cacheObject = redisService.getCacheObject(UserType.OAM_USER.getKey() + loginUser.getUsername()); OamStaffLoginInfo loginInfo = cacheObject.getJSONObject("user").toJavaObject(OamStaffLoginInfo.class); taskWorkOrderRecord.setRecordStaffId(loginInfo.getId()); - //插入记录 + // 插入记录 SpringUtils.getBean(TaskWorkOrderRecordService.class).save(taskWorkOrderRecord); - //负责人手机号 - StaffInfoVo responsibleStaff = SpringUtils.getBean(StaffService.class).getStaffInfo(task.getResponsibleStaffId()); + // 负责人手机号 + StaffInfoVo responsibleStaff = + SpringUtils.getBean(StaffService.class).getStaffInfo(task.getResponsibleStaffId()); List phoneList = new ArrayList<>(); phoneList.add(responsibleStaff.getPhoneNumber()); phoneList.add(loginInfo.getPhoneNumber()); - //通知记录 + // 通知记录 try { - SpringUtils.getBean(WebHookSendHandler.class).webHookSendText(WebHookKeyConstant.ORDER_INFO_BOT, phoneList, task.getTaskName() + "\n\n工单有新回复:\n" + bo.getRecordText(), false); + SpringUtils.getBean(WebHookSendHandler.class) + .webHookSendText(WebHookKeyConstant.ORDER_INFO_BOT, + phoneList, + task.getTaskName() + "\n" + task.getTaskContent() + "\n工单有新回复:\n" + bo.getRecordText(), + false); } catch (IOException e) { throw new ServiceException("发送消息通知失败!"); } } /** - * @param id 主键 - * @Description: 工单办结 - * @return: R - * @Author: DB - * @Date: 2023/5/16 17:10 - **/ + * 工单模块-工单提交-工单提醒 + * @author DB + * @param workOrderId 工单id + * @since 2023-11-29 11:41:46 + * @version 1.0.0 + */ + @Override + public void workOrderRemind(String workOrderId) { + Task task = SpringUtils.getBean(TaskService.class) + .queryChain() + .select(TASK.ALL_COLUMNS) + .leftJoin(TASK_WORK_ORDER) + .on(TASK_WORK_ORDER.TASK_ID.eq(TASK.ID)) + .where(TASK_WORK_ORDER.ID.eq(workOrderId)) + .one(); + // 获取任务状态 + List phoneList = new ArrayList<>(); + try { + // 负责人手机号 + StaffInfoVo responsibleStaff = + SpringUtils.getBean(StaffService.class).getStaffInfo(task.getResponsibleStaffId()); + phoneList.add(responsibleStaff.getPhoneNumber()); + switch (task.getTaskStatus()) { + // 待接收与接收超时 + case 1: + case 7: + SpringUtils.getBean(WebHookSendHandler.class) + .webHookSendText(WebHookKeyConstant.ORDER_INFO_BOT, + phoneList, + task.getTaskName() + "\n" + task.getTaskContent() + "\n您有一条工单需要接收\n", + false); + break; + default: + SpringUtils.getBean(WebHookSendHandler.class) + .webHookSendText(WebHookKeyConstant.ORDER_INFO_BOT, + phoneList, + task.getTaskName() + "\n" + task.getTaskContent() + "\n您有一条工单需要尽快处理\n", + false); + } + } catch (IOException e) { + throw new ServiceException(e.getMessage()); + } + } + + /** + * 工单模块-工单提交-工单转需求 + * @author DB + * @param workOrderId 工单id + * @since 2023-11-29 12:30:21 + * @version 1.0.0 + */ + @Override + public void workOrderToDemand(String workOrderId) { + // 对比当前用户信息 + TaskWorkOrder workOrder = this.getById(workOrderId); + JSONObject loginUserInfo = SecurityUtils.getInstance().getLoginUserInfo(); + if (!StringUtils.equals(workOrder.getRecordStaffId(), loginUserInfo.getString("id"))) { + throw new ServiceException("当前操作员工不是当前工单提交人,请联系提交人操作"); + } + // TODO: 工单转需求 + + } + + /** + * 工单模块-工单提交-工单暂停 + * @author DB + * @param bo 请求参数 + * @since 2023-11-29 16:00:18 + * @version 1.0.0 + */ @Override @Transactional(rollbackFor = Exception.class) - public void concludeWorkOrder(String id) { - //获取工单信息 - TaskWorkOrder taskWorkOrder = this.getById(id); + public void pauseWorkOrder(PauseWorkOrderBo bo) { + // 获取工单信息 + TaskWorkOrder workOrder = this.getById(bo.getWorkOrderId()); + TaskService taskService = SpringUtils.getBean(TaskService.class); + Task task = taskService.getById(workOrder.getTaskId()); + // 设定任务状态暂停 + task.setTaskStatus(5); + taskService.updateById(task); + // 获取记录员工 + // 当前操作员工是否是主要负责人,不是抛出异常 + JSONObject loginUserInfo = SecurityUtils.getInstance().getLoginUserInfo(); + // 负责人手机号 + StaffInfoVo responsibleStaff = + SpringUtils.getBean(StaffService.class).getStaffInfo(task.getResponsibleStaffId()); + List phoneList = new ArrayList<>(); + phoneList.add(responsibleStaff.getPhoneNumber()); + phoneList.add(loginUserInfo.getString("phoneNumber")); + // 通知记录 + try { + SpringUtils.getBean(WebHookSendHandler.class) + .webHookSendText(WebHookKeyConstant.ORDER_INFO_BOT, + phoneList, + task.getTaskName() + "\n" + task.getTaskContent() + "\n工单已暂停到:" + + bo.getPauseExpireTime().format(DateTimeFormatter.ofPattern(DateUtils.YYYY_MM_DD_HH_MM_SS)), + false); + } catch (IOException e) { + throw new ServiceException("发送消息通知失败!"); + } + // 如果任务是在进行中没有逾期,重设定时任务 + if (task.getTaskStatus() == 2) { + startOrUpdateWorkOrderOvertimeTask(bo.getWorkOrderId(), true, bo.getPauseExpireTime()); + } + // 更新工单信息 + this.updateChain() + .set(TASK_WORK_ORDER.PAUSE_STAFF_ID, loginUserInfo.getString("id")) + .set(TASK_WORK_ORDER.PAUSE_EXPIRE_TIME, bo.getPauseExpireTime()) + .set(TASK_WORK_ORDER.PAUSE_RECORD_TIME, LocalDateTime.now()) + .where(TASK_WORK_ORDER.ID.eq(bo.getWorkOrderId())) + .update(); + } + + /** + * 工单模块-工单提交-工单办结 + * @author DB + * @param workOrderId 工单id + * @since 2023-11-29 15:44:08 + * @version 1.0.0 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void workOrderFinish(String workOrderId) { + // 获取工单信息 + TaskWorkOrder taskWorkOrder = this.getById(workOrderId); + JSONObject loginUserInfo = SecurityUtils.getInstance().getLoginUserInfo(); + taskWorkOrder.setFinishStaffId(loginUserInfo.getString("id")); LocalDateTime finishTime = LocalDateTime.now(); taskWorkOrder.setFinishTime(finishTime); - //设置工单完成 + // 设置工单完成 TaskService taskService = SpringUtils.getBean(TaskService.class); Task task = taskService.getOne(QueryWrapper.create().where(TASK.ID.eq(taskWorkOrder.getTaskId()))); - //超时设置逾期 - if (finishTime.compareTo(task.getTaskReceiptTime()) > 0 || Duration.between(finishTime, task.getTaskReceiptTime()).toMillis() >= 7200000) { - //工单暂停期间完成 + // 超时设置逾期 + if (finishTime.compareTo(task.getTaskReceiptTime()) > 0 + || Duration.between(finishTime, task.getTaskReceiptTime()).toMillis() >= 4800000) { + // 工单暂停期间完成 task.setTaskStatus(3); } else { task.setTaskStatus(6); @@ -303,76 +574,48 @@ public class TaskWorkOrderServiceImpl extends ServiceImpl staffIds = new HashSet<>(); staffIds.add(task.getResponsibleStaffId()); staffIds.add(taskWorkOrder.getRecordStaffId()); - Map staffMap = staffService.listAs(QueryWrapper.create() + Map staffMap = + staffService + .listAs( + QueryWrapper.create() .select(STAFF.ID, STAFF.NAME) .select(SYS_USER.PHONE_NUMBER.as(StaffInfoVo::getPhoneNumber)) .from(STAFF) - .leftJoin(SYS_USER).on(SYS_USER.ID.eq(STAFF.ID)) - .where(STAFF.ID.in(staffIds)) - , StaffInfoVo.class).stream().collect(Collectors.toMap(StaffInfoVo::getId, item -> item)); + .leftJoin(SYS_USER) + .on(SYS_USER.ID.eq(STAFF.ID)) + .where(STAFF.ID.in(staffIds)), + StaffInfoVo.class) + .stream() + .collect(Collectors.toMap(StaffInfoVo::getId, item -> item)); List phoneList = new ArrayList<>(); phoneList.add(staffMap.get(task.getResponsibleStaffId()).getPhoneNumber()); - //记录人手机号 + // 记录人手机号 phoneList.add(staffMap.get(taskWorkOrder.getRecordStaffId()).getPhoneNumber()); - //通知记录 + // 通知记录 try { - SpringUtils.getBean(WebHookSendHandler.class).webHookSendText(WebHookKeyConstant.ORDER_INFO_BOT, phoneList, task.getTaskName() + "\n\n工单办结", false); + SpringUtils.getBean(WebHookSendHandler.class) + .webHookSendText(WebHookKeyConstant.ORDER_INFO_BOT, + phoneList, + task.getTaskName() + "\n" + task.getTaskContent() + "\n工单办结", + false); } catch (IOException e) { throw new ServiceException("发送消息通知失败!"); } + // 删除工单完结超时任务 + try { + SpringUtils.getBean(QuartzUtils.class) + .deleteJob(QuartzEnums.WORK_ORDER_OVERTIME_TASK.getName() + workOrderId, + QuartzEnums.WORK_ORDER_OVERTIME_TASK.getGroup()); + } catch (SchedulerException e) { + throw new ServiceException("删除工单完结超时任务失败"); + } } - /** - * @param bo 请求参数 - * @Description: 工单暂停 - * @return: R - * @Author: DB - * @Date: 2023/5/16 17:10 - **/ - @Override - public void pauseWorkOrder(PauseWorkOrderBo bo) { - TaskService taskService = SpringUtils.getBean(TaskService.class); - Task task = taskService.getById(bo.getTaskId()); - boolean isUpdate; - if (task.getTaskStatus() == 2) { - isUpdate = true; - } else { - //已是逾期状态,需要重新生成定时任务 - isUpdate = false; - //绩点调整回0 - SpringUtils.getBean(TaskStaffGroupService.class).updateChain().set(TASK_STAFF_GROUP.GRADE_POINT, 0).where(TASK_STAFF_GROUP.TASK_ID.eq(task.getId())).update(); - } - //重新设定任务状态暂停 - task.setTaskStatus(5); - task.setTaskReceiptTime(bo.getTaskReceiptTime()); - taskService.updateById(task); - //获取记录员工 - //当前操作员工是否是主要负责人,不是抛出异常 - LoginUser loginUser = SecurityUtils.getInstance().getLoginUser(); - //读取员工信息 - RedisService redisService = SpringUtils.getBean(RedisService.class); - JSONObject cacheObject = redisService.getCacheObject(UserType.OAM_USER.getKey() + loginUser.getUsername()); - OamStaffLoginInfo loginInfo = cacheObject.getJSONObject("user").toJavaObject(OamStaffLoginInfo.class); - //负责人手机号 - StaffInfoVo responsibleStaff = SpringUtils.getBean(StaffService.class).getStaffInfo(task.getResponsibleStaffId()); - List phoneList = new ArrayList<>(); - phoneList.add(responsibleStaff.getPhoneNumber()); - phoneList.add(loginInfo.getPhoneNumber()); - //通知记录 - Date date = Date.valueOf(bo.getTaskReceiptTime().toLocalDate()); - try { - SpringUtils.getBean(WebHookSendHandler.class).webHookSendText(WebHookKeyConstant.ORDER_INFO_BOT, phoneList,task.getTaskName() + "\n\n工单已暂停到:" + DateUtils.format(date, DateUtils.YYYY_MM_DD_HH_MM_SS), false); - } catch (IOException e) { - throw new ServiceException("发送消息通知失败!"); - } - TaskWorkOrder taskWorkOrder = this.getOne(QueryWrapper.create().where(TASK_WORK_ORDER.TASK_ID.eq(bo.getTaskId()))); - //更新定时任务 - startOrUpdateWorkOrderOvertimeTask(taskWorkOrder.getId(), isUpdate, date); - } } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/StoreListVo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/StoreListVo.java index 60e1936..7749c3d 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/StoreListVo.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/StoreListVo.java @@ -1,7 +1,33 @@ -package com.cpop.oam.business.vo;/** +package com.cpop.oam.business.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** * @author DB * @createTime 2023/11/28 12:35 - * @description + * @description */ -public class StoreListVo { +@Data +@Accessors(chain = true) +@ApiModel(value = "校区/店铺对象", description = "校区/店铺对象") +public class StoreListVo implements Serializable { + + /** + * id + */ + private String id; + + /** + * 校区名 + */ + private String storeName; + + /** + * 云校区id + */ + private String storeCloudId; } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderPageVo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderPageVo.java index a4818f1..f0783e8 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderPageVo.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderPageVo.java @@ -17,26 +17,7 @@ import java.time.LocalDateTime; @Data @Accessors(chain = true) @ApiModel(value = "TaskWorkOrderPageVo对象", description = "任务-工单-记录") -public class TaskWorkOrderPageVo implements Serializable { - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @ApiModelProperty("主键") - private String id; - - /** - * 任务id - */ - @ApiModelProperty("任务id") - private String taskId; - - /** - * 任务名 - */ - @ApiModelProperty("任务名") - private String taskName; +public class TaskWorkOrderPageVo { /** * 任务内容 @@ -45,81 +26,22 @@ public class TaskWorkOrderPageVo implements Serializable { private String taskContent; /** - * 品牌id + * 办结员工id */ - @ApiModelProperty("品牌id") - private String brandId; + @ApiModelProperty("办结员工id") + private String finishStaffId; /** - * 品牌 + * 办结员工 */ - @ApiModelProperty("品牌") - private String brandName; - - /** - * 校区id - */ - @ApiModelProperty("校区id") - private String campusId; - - /** - * 校区 - */ - @ApiModelProperty("校区") - private String campusName; - - /** - * 附件地址 - */ - @ApiModelProperty("附件地址") - private String attachmentUrl; - - /** - * 备注 - */ - @ApiModelProperty("备注") - private String remarks; - - /** - * 问题手机号 - */ - @ApiModelProperty("问题手机号") - private String phoneNumber; - - /** - * 记录员工id - */ - @ApiModelProperty("记录员工id") - private String recordStaffId; - - /** - * 记录员工 - */ - @ApiModelProperty("记录员工") - private String recordStaffName; - - /** - * 接收员工id - */ - @ApiModelProperty("接收员工id") - private String responsibleStaffId; - - /** - * 接收员工 - */ - @ApiModelProperty("接收员工") - private String responsibleStaffName; + @ApiModelProperty("办结员工") + private String finishStaffName; /** * 办结时间 */ @ApiModelProperty("办结时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime finishTime; - /** - * 任务状态 - */ - @ApiModelProperty("任务状态") - private Integer taskStatus; } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderReceiveDealPauseVo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderReceiveDealPauseVo.java index 611c34a..87693b9 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderReceiveDealPauseVo.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderReceiveDealPauseVo.java @@ -1,7 +1,228 @@ -package com.cpop.oam.business.vo;/** +package com.cpop.oam.business.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** * @author DB * @createTime 2023/11/28 15:08 - * @description + * @description */ +@Data +@Accessors(chain = true) +@ApiModel(value = "接收/处理/暂停中页面返回对象", description = "接收/处理/暂停中对象") public class TaskWorkOrderReceiveDealPauseVo { + + /** + * 待接收列表 + */ + @ApiModelProperty(value = "待接收列表") + private List receiveList; + + /** + * 处理中列表 + */ + @ApiModelProperty(value = "处理中列表") + private List dealList; + + /** + * 暂停中列表 + */ + @ApiModelProperty(value = "暂停中列表") + private List pauseList; + + /** + * 接收 + */ + @Data + @ApiModel("待接收") + public static class Receive { + + /** + * 工单id + */ + @ApiModelProperty(value = "工单id") + private String id; + + /** + * 机构/品牌 + */ + @ApiModelProperty(value = "机构/品牌") + private String brandName; + + /** + * 校区/店铺 + */ + @ApiModelProperty(value = "校区/店铺") + private String storeName; + + /** + * 问题描述 + */ + @ApiModelProperty(value = "问题描述") + private String taskContent; + + /** + * 手机号 + */ + @ApiModelProperty(value = "手机号") + private String phoneNumber; + + /** + * 提交人 + */ + @ApiModelProperty(value = "提交人") + private String recordStaffName; + + /** + * 提交时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty(value = "提交时间") + private LocalDateTime createTime; + + } + + /** + * 接收 + */ + @Data + @ApiModel("处理中") + public static class Deal { + + /** + * 工单id + */ + @ApiModelProperty(value = "工单id") + private String id; + + /** + * 机构/品牌 + */ + @ApiModelProperty(value = "机构/品牌") + private String brandName; + + /** + * 校区/店铺 + */ + @ApiModelProperty(value = "校区/店铺") + private String storeName; + + /** + * 问题描述 + */ + @ApiModelProperty(value = "问题描述") + private String taskContent; + + /** + * 提交人 + */ + @ApiModelProperty(value = "提交人") + private String recordStaffName; + + /** + * 提交时间 + */ + @ApiModelProperty(value = "提交时间") + private LocalDateTime createTime; + + /** + * 接收人 + */ + @ApiModelProperty(value = "接收人") + private String responsibleStaffName; + + /** + * 任务接收时间 + */ + @ApiModelProperty(value = "任务接收时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime taskReceiptTime; + + /** + * 任务接收用时/min + */ + @ApiModelProperty(value = "任务接收用时/min") + private Integer receivingTime; + + } + + /** + * 暂停中 + */ + @Data + @ApiModel("暂停中") + public static class Pause { + + /** + * 工单id + */ + @ApiModelProperty(value = "工单id") + private String id; + + /** + * 机构/品牌 + */ + @ApiModelProperty(value = "机构/品牌") + private String brandName; + + /** + * 校区/店铺 + */ + @ApiModelProperty(value = "校区/店铺") + private String storeName; + + /** + * 问题描述 + */ + @ApiModelProperty(value = "问题描述") + private String taskContent; + + /** + * 提交人 + */ + @ApiModelProperty(value = "提交人") + private String recordStaffName; + + /** + * 提交时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty(value = "提交时间") + private LocalDateTime createTime; + + /** + * 接收人 + */ + @ApiModelProperty(value = "接收人") + private String responsibleStaffName; + + /** + * 暂停员工 + */ + @ApiModelProperty(value = "暂停员工") + private String pauseStaffName; + + /** + * 暂停记录时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty(value = "暂停记录时间") + private LocalDateTime pauseRecordTime; + + /** + * 暂停到期时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty(value = "暂停到期时间") + private LocalDateTime pauseExpireTime; + + } } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderRecordListVo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderRecordListVo.java index 235ca7a..df3d3a3 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderRecordListVo.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderRecordListVo.java @@ -6,20 +6,18 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; -import java.io.Serializable; import java.sql.Timestamp; /** - * @author: DB - * @Date: 2023/07/11/14:25 - * @Description: + * 任务-工单记录-记录 + * @author DB + * @since 2023-11-29 11:30:57 + * @version 1.0.0 */ @Data @Accessors(chain = true) @ApiModel(value = "TaskWorkOrderRecordListVo对象", description = "任务-工单记录-记录") -public class TaskWorkOrderRecordListVo implements Serializable { - - private static final long serialVersionUID = 1L; +public class TaskWorkOrderRecordListVo { /** * 主键 @@ -67,6 +65,6 @@ public class TaskWorkOrderRecordListVo implements Serializable { * 创建时间 */ @ApiModelProperty("创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Timestamp createTime; } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/WorkOrderDutyVo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/WorkOrderDutyVo.java new file mode 100644 index 0000000..c78061a --- /dev/null +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/WorkOrderDutyVo.java @@ -0,0 +1,56 @@ +package com.cpop.oam.business.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mybatisflex.annotation.RelationOneToOne; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDate; + +/** + * 工单值班返回对象 + * @author DB + * @since 2023-11-29 13:58:05 + * @version 1.0.0 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "工单值班返回对象", description = "工单值班返回对象") +public class WorkOrderDutyVo { + + /** + * 服务员工id + */ + @ApiModelProperty("服务员工id") + private String serviceStaffId; + + /** + * 服务员工名称 + */ + @RelationOneToOne(selfField = "serviceStaffId", targetField = "id", targetTable = "cp_oam_staff", valueField = "name") + @ApiModelProperty("服务员工名称") + private String serviceStaffName; + + /** + * 技术员工id + */ + @ApiModelProperty("技术员工id") + private String technologyStaffId; + + /** + * 技术员工名称 + */ + @RelationOneToOne(selfField = "technologyStaffId", targetField = "id", targetTable = "cp_oam_staff", valueField = "name") + @ApiModelProperty("技术员工名称") + private String technologyStaffName; + + /** + * 值班日期 + */ + @ApiModelProperty("值班日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private LocalDate dutyDate; + +} diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/framework/enums/QuartzEnums.java b/Cpop-Oam/src/main/java/com/cpop/oam/framework/enums/QuartzEnums.java index 94ba981..1123fa2 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/framework/enums/QuartzEnums.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/framework/enums/QuartzEnums.java @@ -10,7 +10,11 @@ public enum QuartzEnums { /** * 工单超时定时任务 */ - WORK_ORDER_OVERTIME_TASK("WorkOrderOvertimeTask:", "WorkOrder"); + WORK_ORDER_OVERTIME_TASK("WorkOrderOvertimeTask:", "WorkOrder"), + /** + * 工单接收超时定时任务 + */ + WORK_ORDER_ACCEPT_OVERTIME_TASK("WorkOrderAcceptOvertimeTask:", "WorkOrder"); QuartzEnums(String name, String group) { this.name = name; diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderAcceptOverTimeTask.java b/Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderAcceptOverTimeTask.java new file mode 100644 index 0000000..ad61f2c --- /dev/null +++ b/Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderAcceptOverTimeTask.java @@ -0,0 +1,52 @@ +package com.cpop.oam.framework.tasks; + +import com.cpop.core.utils.SpringUtils; +import com.cpop.oam.business.entity.Task; +import com.cpop.oam.business.entity.TaskWorkOrder; +import com.cpop.oam.business.service.TaskStaffGroupService; +import com.cpop.oam.business.service.TaskWorkOrderService; +import org.quartz.Job; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import static com.cpop.oam.business.entity.table.TaskStaffGroupTableDef.TASK_STAFF_GROUP; +import static com.cpop.oam.business.entity.table.TaskTableDef.TASK; + +import com.cpop.oam.business.service.TaskService; + +/** + * 工单接收超时定时任务 + * + * @author DB + * @since 2023-11-29 10:13:22 + * @version 1.0.0 + */ +public class WorkOrderAcceptOverTimeTask implements Job { + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + // 获取工单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()); + if (task != null) { + // 工单超时为接收,扣除5绩点 + TaskStaffGroupService taskStaffGroupService = SpringUtils.getBean(TaskStaffGroupService.class); + taskStaffGroupService.updateChain() + .set(TASK_STAFF_GROUP.GRADE_POINT, -5) + .where(TASK_STAFF_GROUP.TASK_ID.eq(task.getId()) + .and(TASK_STAFF_GROUP.STAFF_ID.eq(task.getResponsibleStaffId()))); + // 更新任务为接收超时 + taskService.updateChain() + .set(TASK.TASK_STATUS, 7) + .set(TASK.REMARK, "工单接收超时扣除5绩点 ") + .where(TASK.ID.eq(task.getId())) + .update(); + } + } +} diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderOvertimeTask.java b/Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderOvertimeTask.java index 9b4b37e..c536693 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderOvertimeTask.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderOvertimeTask.java @@ -15,7 +15,7 @@ import static com.cpop.oam.business.entity.table.TaskStaffGroupTableDef.TASK_STA import static com.cpop.oam.business.entity.table.TaskTableDef.TASK; /** - * @author: DB + * @author DB * @Date: 2023/07/12/17:11 * @Description: 工单任务超时检查 */ @@ -23,19 +23,24 @@ public class WorkOrderOvertimeTask implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) { - //获取工单id + // 获取工单id JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap(); String workOrderId = jobDataMap.getString("WorkOrderId"); TaskWorkOrderService taskWorkOrderService = SpringUtils.getBean(TaskWorkOrderService.class); TaskWorkOrder taskWorkOrder = taskWorkOrderService.getById(workOrderId); - //逾期 - if (null == taskWorkOrder.getFinishTime() || (taskWorkOrder.getFinishTime().compareTo(LocalDateTime.now()) > 0)) { - //修改任务逾期 - TaskService taskService = SpringUtils.getBean(TaskService.class); - taskService.updateChain().set(TASK.TASK_STATUS, 4).where(TASK.ID.eq(taskWorkOrder.getTaskId())).update(); - //扣除5点绩点 - TaskStaffGroupService taskStaffGroupService = SpringUtils.getBean(TaskStaffGroupService.class); - taskStaffGroupService.updateChain().set(TASK_STAFF_GROUP.GRADE_POINT, -5).where(TASK_STAFF_GROUP.TASK_ID.eq(taskWorkOrder.getTaskId())); - } + // 修改任务逾期 + TaskService taskService = SpringUtils.getBean(TaskService.class); + taskService.updateChain().set(TASK.TASK_STATUS, 4).where(TASK.ID.eq(taskWorkOrder.getTaskId())).update(); + // 扣除5点绩点 + TaskStaffGroupService taskStaffGroupService = SpringUtils.getBean(TaskStaffGroupService.class); + taskStaffGroupService.updateChain() + .setRaw(TASK_STAFF_GROUP.GRADE_POINT, "grade_point - 5") + .where(TASK_STAFF_GROUP.TASK_ID.eq(workOrderId)); + // 更新任务为逾期 + taskService.updateChain() + .set(TASK.TASK_STATUS, 4) + .set(TASK.REMARK, "remark + '工单完结超时扣除5绩点'") + .where(TASK.ID.eq(taskWorkOrder.getTaskId())) + .update(); } } diff --git a/Cpop-System/src/main/java/com/cpop/system/business/bo/BrandBo.java b/Cpop-System/src/main/java/com/cpop/system/business/bo/BrandBo.java index 7390aa3..4bbe74d 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/bo/BrandBo.java +++ b/Cpop-System/src/main/java/com/cpop/system/business/bo/BrandBo.java @@ -36,10 +36,4 @@ public class BrandBo { @ApiModelProperty(value = "微信商户号") private String wxMchId; - /** - * 背景图 - */ - @StringArrayConvert - @ApiModelProperty("背景图") - private String backgroundUrl; } diff --git a/Cpop-System/src/main/java/com/cpop/system/business/entity/Brand.java b/Cpop-System/src/main/java/com/cpop/system/business/entity/Brand.java index 67603f4..b20c319 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/entity/Brand.java +++ b/Cpop-System/src/main/java/com/cpop/system/business/entity/Brand.java @@ -50,11 +50,6 @@ public class Brand extends BaseEntity implements Serializable { */ private String sourceType; - /** - * 背景图 - */ - private String backgroundUrl; - /** * 是否开通分账 */ diff --git a/Cpop-System/src/main/java/com/cpop/system/business/entity/Store.java b/Cpop-System/src/main/java/com/cpop/system/business/entity/Store.java index dd94bcc..7d43e42 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/entity/Store.java +++ b/Cpop-System/src/main/java/com/cpop/system/business/entity/Store.java @@ -45,11 +45,6 @@ public class Store extends BaseEntity implements Serializable { */ private String brandId; - /** - * 地址 - */ - private String address; - /** * 来源 */ diff --git a/Cpop-System/src/main/java/com/cpop/system/business/service/impl/BrandServiceImpl.java b/Cpop-System/src/main/java/com/cpop/system/business/service/impl/BrandServiceImpl.java index 259787f..ab247f7 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/service/impl/BrandServiceImpl.java +++ b/Cpop-System/src/main/java/com/cpop/system/business/service/impl/BrandServiceImpl.java @@ -73,7 +73,6 @@ public class BrandServiceImpl extends ServiceImpl implements Brand sysBrand = new Brand(); sysBrand.setBrandName(brand.getString("name")) .setWxMchId(brand.getString("wxMchId")) - .setBackgroundUrl(brand.getString("brandBg")) .setSourceType(SourceType.JAMBOX.toString()); this.save(sysBrand); //果酱拓展表信息 @@ -152,7 +151,7 @@ public class BrandServiceImpl extends ServiceImpl implements PageDomain pageDomain = SqlUtils.getInstance().getPageDomain(); return this.mapper.paginateAs(pageDomain.getPageNum(), pageDomain.getPageSize(), QueryWrapper.create() - .select(BRAND.ID, BRAND.BRAND_NAME, BRAND.WX_MCH_ID, BRAND.CREATE_TIME, BRAND.BACKGROUND_URL, BRAND.IS_OPEN_SHARING) + .select(BRAND.ID, BRAND.BRAND_NAME, BRAND.WX_MCH_ID, BRAND.CREATE_TIME, BRAND.IS_OPEN_SHARING) .and(BRAND.BRAND_NAME.like(brandName)), BrandPageVo.class); } diff --git a/Cpop-System/src/main/java/com/cpop/system/business/vo/BrandPageVo.java b/Cpop-System/src/main/java/com/cpop/system/business/vo/BrandPageVo.java index 9809c95..e62db27 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/vo/BrandPageVo.java +++ b/Cpop-System/src/main/java/com/cpop/system/business/vo/BrandPageVo.java @@ -40,31 +40,6 @@ public class BrandPageVo implements Serializable { @ApiModelProperty("微信商户号") private String wxMchId; - /** - * 微信appid - */ - @ApiModelProperty("微信appid") - private String wxAppId; - - /** - * 微信支付密钥 - */ - @ApiModelProperty("微信支付密钥") - private String wxMchKey; - - /** - * 微信支付keypath - */ - @ApiModelProperty("微信支付keyPath") - private String wxKeyPath; - - /** - * 背景图 - */ - @StringArrayConvert - @ApiModelProperty("背景图") - private String backgroundUrl; - /** * 是否开通分账 */ diff --git a/Cpop-System/src/main/java/com/cpop/system/business/vo/StorePageVo.java b/Cpop-System/src/main/java/com/cpop/system/business/vo/StorePageVo.java index 604e552..9dd1efb 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/vo/StorePageVo.java +++ b/Cpop-System/src/main/java/com/cpop/system/business/vo/StorePageVo.java @@ -1,10 +1,13 @@ package com.cpop.system.business.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; +import java.time.LocalDateTime; + import com.cpop.core.base.enums.SourceType; /* @@ -49,16 +52,17 @@ public class StorePageVo implements Serializable { @ApiModelProperty("店铺/校区名") private String storeName; - /** - * 地址 - */ - @ApiModelProperty("地址") - private String address; - /** * 数据来源 */ @ApiModelProperty("数据来源") private SourceType sourceType; + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8") + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + }