Compare commits

...

4 Commits

  1. 4
      node.md
  2. 50
      sql/mysql/iot.sql
  3. 87
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/receivable/CrmReceivableDO.java
  4. 15
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/receivable/CrmReceivableMapper.java
  5. 18
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/receivable/CrmReceivableService.java
  6. 79
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/receivable/CrmReceivableServiceImpl.java
  7. 32
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/receivable/listener/CrmReceivableStatusListener.java
  8. 2
      yudao-module-system/yudao-module-system-biz/src/main/resources/application.yaml

4
node.md

@ -0,0 +1,4 @@
分支说明:
master: 默认分支
pro: 用于和官网芋道同步代码
release: 用于公司发布

50
sql/mysql/iot.sql

@ -51,32 +51,32 @@ COMMIT;
DROP TABLE IF EXISTS `iot_device`;
CREATE TABLE `iot_device` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '设备 ID,主键,自增',
`device_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '设备唯一标识符,全局唯一,用于识别设备',
`device_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '设备名称,在产品内唯一,用于标识设备',
`nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '设备备注名称,供用户自定义备注',
`serial_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '设备序列号',
`device_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '设备唯一标识符,全局唯一,用于识别设备',
`device_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '设备名称,在产品内唯一,用于标识设备',
`nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '设备备注名称,供用户自定义备注',
`serial_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '设备序列号',
`pic_url` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '设备图片',
`group_ids` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '设备分组编号集合',
`product_id` bigint UNSIGNED NOT NULL COMMENT '产品 ID',
`product_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '产品 Key',
`product_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品 Key',
`device_type` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '设备类型,参见 IotProductDeviceTypeEnum 枚举',
`gateway_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '网关设备 ID,子设备需要关联的网关设备 ID',
`state` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '设备状态,参见 IotDeviceStateEnum 枚举',
`online_time` datetime NULL DEFAULT NULL COMMENT '最后上线时间',
`offline_time` datetime NULL DEFAULT NULL COMMENT '最后离线时间',
`active_time` datetime NULL DEFAULT NULL COMMENT '设备激活时间',
`ip` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '设备的 IP 地址',
`firmware_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '设备的固件编号',
`device_secret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '设备密钥,用于设备认证,需安全存储',
`mqtt_client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'MQTT 客户端 ID',
`mqtt_username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'MQTT 用户名',
`mqtt_password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'MQTT 密码',
`auth_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '认证类型(如一机一密、动态注册)',
`ip` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '设备的 IP 地址',
`firmware_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '设备的固件编号',
`device_secret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '设备密钥,用于设备认证,需安全存储',
`mqtt_client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'MQTT 客户端 ID',
`mqtt_username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'MQTT 用户名',
`mqtt_password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'MQTT 密码',
`auth_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '认证类型(如一机一密、动态注册)',
`latitude` decimal(10, 6) NULL DEFAULT NULL COMMENT '设备位置的纬度',
`longitude` decimal(10, 6) NULL DEFAULT NULL COMMENT '设备位置的经度',
`area_id` int UNSIGNED NULL DEFAULT NULL COMMENT '地区编码',
`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '设备详细地址',
`config` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '设备配置,JSON 格式',
`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '设备详细地址',
`config` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '设备配置,JSON 格式',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
@ -88,7 +88,7 @@ CREATE TABLE `iot_device` (
UNIQUE INDEX `uniq_device_name_product_id`(`device_name` ASC, `product_id` ASC) USING BTREE,
INDEX `idx_product_id`(`product_id` ASC) USING BTREE,
INDEX `idx_gateway_id`(`gateway_id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 30 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'IoT 设备表';
) ENGINE = InnoDB AUTO_INCREMENT = 30 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'IoT 设备表';
-- ----------------------------
-- Records of iot_device
@ -259,11 +259,11 @@ COMMIT;
DROP TABLE IF EXISTS `iot_thing_model`;
CREATE TABLE `iot_thing_model` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '物模型功能编号',
`identifier` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '功能标识',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '功能名称',
`description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '功能描述',
`identifier` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '功能标识',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '功能名称',
`description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '功能描述',
`product_id` bigint UNSIGNED NOT NULL COMMENT '产品ID(关联 IotProductDO 的 id)',
`product_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '产品Key(关联 IotProductDO 的 productKey)',
`product_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品Key(关联 IotProductDO 的 productKey)',
`type` tinyint UNSIGNED NOT NULL COMMENT '功能类型(1 - 属性,2 - 服务,3 - 事件)',
`property` json NULL COMMENT '属性(存储 ThingModelProperty 的 JSON 数据)',
`event` json NULL COMMENT '事件(存储 ThingModelEvent 的 JSON 数据)',
@ -277,7 +277,7 @@ CREATE TABLE `iot_thing_model` (
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_product_id`(`product_id` ASC) USING BTREE,
INDEX `idx_product_key`(`product_key` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'IoT 产品物模型功能表';
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'IoT 产品物模型功能表';
-- ----------------------------
-- Records of iot_thing_model
@ -292,11 +292,11 @@ COMMIT;
DROP TABLE IF EXISTS `iot_think_model_function`;
CREATE TABLE `iot_think_model_function` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '物模型功能编号',
`identifier` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '功能标识',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '功能名称',
`description` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '功能描述',
`identifier` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '功能标识',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '功能名称',
`description` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '功能描述',
`product_id` bigint UNSIGNED NOT NULL COMMENT '产品ID(关联 IotProductDO 的 id)',
`product_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '产品Key(关联 IotProductDO 的 productKey)',
`product_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '产品Key(关联 IotProductDO 的 productKey)',
`type` tinyint UNSIGNED NOT NULL COMMENT '功能类型(1 - 属性,2 - 服务,3 - 事件)',
`property` json NULL COMMENT '属性(存储 ThingModelProperty 的 JSON 数据)',
`event` json NULL COMMENT '事件(存储 ThingModelEvent 的 JSON 数据)',
@ -310,7 +310,7 @@ CREATE TABLE `iot_think_model_function` (
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_product_id`(`product_id` ASC) USING BTREE,
INDEX `idx_product_key`(`product_key` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 22 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'IoT 产品物模型功能表';
) ENGINE = InnoDB AUTO_INCREMENT = 22 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'IoT 产品物模型功能表';
-- ----------------------------
-- Records of iot_think_model_function

87
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/receivable/CrmReceivableDO.java

@ -0,0 +1,87 @@
package cn.iocoder.yudao.module.bpm.dal.dataobject.receivable;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 回款 DO
*
* @author 赤焰
*/
@TableName("crm_receivable")
@KeySequence("crm_receivable_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CrmReceivableDO extends BaseDO {
/**
* ID
*/
@TableId
private Long id;
/**
* 回款编号
*/
private String no;
/**
* 回款计划编号
*
*/
private Long planId;
/**
* 客户编号
*
*/
private Long customerId;
/**
* 合同编号
*
*/
private Long contractId;
/**
* 负责人编号关联 {@link AdminUserRespDTO#getId()}
*/
private Long ownerUserId;
/**
* 回款日期
*/
private LocalDateTime returnTime;
/**
* 回款方式
*
*/
private Integer returnType;
/**
* 计划回款金额单位
*/
private BigDecimal price;
/**
* 备注
*/
private String remark;
/**
* 工作流编号
*
* 关联 ProcessInstance id 属性
*/
private String processInstanceId;
/**
* 审批状态
*
*/
private Integer auditStatus;
}

15
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/receivable/CrmReceivableMapper.java

@ -0,0 +1,15 @@
package cn.iocoder.yudao.module.bpm.dal.mysql.receivable;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.bpm.dal.dataobject.receivable.CrmReceivableDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 回款 Mapper
*
* @author 赤焰
*/
@Mapper
public interface CrmReceivableMapper extends BaseMapperX<CrmReceivableDO> {
}

18
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/receivable/CrmReceivableService.java

@ -0,0 +1,18 @@
package cn.iocoder.yudao.module.bpm.service.receivable;
/**
* CRM 回款 Service 接口
*
* @author 赤焰
*/
public interface CrmReceivableService {
/**
* 更新回款流程审批结果
*
* @param id 回款编号
* @param bpmResult BPM 审批结果
*/
void updateReceivableAuditStatus(Long id, Integer bpmResult);
}

79
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/receivable/CrmReceivableServiceImpl.java

@ -0,0 +1,79 @@
package cn.iocoder.yudao.module.bpm.service.receivable;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.dal.dataobject.receivable.CrmReceivableDO;
import cn.iocoder.yudao.module.bpm.dal.mysql.receivable.CrmReceivableMapper;
import cn.iocoder.yudao.module.bpm.enums.common.CrmAuditStatusEnum;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
/**
* CRM 回款 Service 实现类
*
* @author 赤焰
*/
@Service
@Validated
@Slf4j
public class CrmReceivableServiceImpl implements CrmReceivableService {
/**
* BPM 合同审批流程标识
*/
public static final String BPM_PROCESS_DEFINITION_KEY = "crm-receivable-audit";
@Resource
private CrmReceivableMapper receivableMapper;
@Resource
private AdminUserApi adminUserApi;
@Resource
private BpmProcessInstanceApi bpmProcessInstanceApi;
@Override
public void updateReceivableAuditStatus(Long id, Integer bpmResult) {
// 1.1 校验存在
CrmReceivableDO receivable = validateReceivableExists(id);
// 1.2 只有审批中可以更新审批结果
if (ObjUtil.notEqual(receivable.getAuditStatus(), CrmAuditStatusEnum.PROCESS.getStatus())) {
log.error("[updateReceivableAuditStatus][receivable({}) 不处于审批中,无法更新审批结果({})]",
receivable.getId(), bpmResult);
throw exception(new ErrorCode(1_020_004_004, "更新回款审核状态失败,原因:回款不是审核中状态"));
}
// 2. 更新回款审批状态
Integer auditStatus = convertBpmResultToAuditStatus(bpmResult);
receivableMapper.updateById(new CrmReceivableDO().setId(id).setAuditStatus(auditStatus));
}
private CrmReceivableDO validateReceivableExists(Long id) {
CrmReceivableDO receivable = receivableMapper.selectById(id);
if (receivable == null) {
throw exception(new ErrorCode(1_020_004_000, "回款不存在"));
}
return receivable;
}
/**
* BPM 审批结果转换
*
* @param bpmResult BPM 审批结果
*/
public static Integer convertBpmResultToAuditStatus(Integer bpmResult) {
Integer auditStatus = BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmResult) ? CrmAuditStatusEnum.APPROVE.getStatus()
: BpmTaskStatusEnum.REJECT.getStatus().equals(bpmResult) ? CrmAuditStatusEnum.REJECT.getStatus()
: BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmResult) ? BpmTaskStatusEnum.CANCEL.getStatus() : null;
Assert.notNull(auditStatus, "BPM 审批结果({}) 转换失败", bpmResult);
return auditStatus;
}
}

32
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/receivable/listener/CrmReceivableStatusListener.java

@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.bpm.service.receivable.listener;
import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.bpm.service.receivable.CrmReceivableService;
import cn.iocoder.yudao.module.bpm.service.receivable.CrmReceivableServiceImpl;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 回款审批的结果的监听器实现类
*
* @author HUIHUI
*/
@Component
public class CrmReceivableStatusListener extends BpmProcessInstanceStatusEventListener {
@Resource
private CrmReceivableService receivableService;
@Override
public String getProcessDefinitionKey() {
return CrmReceivableServiceImpl.BPM_PROCESS_DEFINITION_KEY;
}
@Override
public void onEvent(BpmProcessInstanceStatusEvent event) {
receivableService.updateReceivableAuditStatus(Long.parseLong(event.getBusinessKey()), event.getStatus());
}
}

2
yudao-module-system/yudao-module-system-biz/src/main/resources/application.yaml

@ -136,7 +136,7 @@ aj:
cache-number: 1000 # local 缓存的阈值,达到这个值,清除缓存
timing-clear: 180 # local定时清除过期缓存(单位秒),设置为0代表不执行
type: blockPuzzle # 验证码类型 default两种都实例化。 blockPuzzle 滑块拼图 clickWord 文字点选
water-mark: 芋道源码 # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode
water-mark: 慧军商城 # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode
interference-options: 0 # 滑动干扰项(0/1/2)
req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false
req-get-lock-limit: 5 # 验证失败5次,get接口锁定

Loading…
Cancel
Save