目录
3、流程Key(可以通过ext_act_flow_biz数据库表查询到)
一、接口模型实体类及流程Key
1、以入住办理审核流程为例
package com.krt.business.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.krt.common.annotation.KrtActField;
import com.krt.common.base.BaseActEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
* 业务_新承业务实体类
*
* @author lf
* @version 1.0
* @date 2021-01-26 14:48
*/
@ApiModel(value = "业务_新承业务")
@Data
@TableName("business_into_house")
public class BusinessIntoHouse extends BaseActEntity {
/**
* ---------------------------------------基本信息------------------------------------
*/
@ApiModelProperty(value = "流程ID")
private String processId;
@ApiModelProperty(value = "中签表id,prh_batch_winning.id")
private Integer winningId;
@ApiModelProperty(value = "中签批次id,根据apply_type_code路由关联对应的批次表")
private Integer winningBatchId;
@ApiModelProperty(value = "中签批次名称")
private String winningBatchName;
@ApiModelProperty(value = "允许受理新承业务开始日期")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date intoStartDate;
@ApiModelProperty(value = "允许受理新承业务结束日期")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date intoEndDate;
@ApiModelProperty(value = "状态:1待入驻、2已入住、3放弃承租、4不符合资格、5房管部待受理")
private String status;
@ApiModelProperty(value = "缴费状态:1缴费完成")
private String payStatus;
@ApiModelProperty(value = "核查是否结束:1是0否(所有单位都核查完毕)")
private String checkIsEnd;
@ApiModelProperty(value = "协查批次uuid")
private String checkUuid;
@ApiModelProperty(value = "申请时间")
private Date businessApplyTime;
@ApiModelProperty("房管所code")
@KrtActField(name = "房管所code", isCascadeBusOrgan = true)
private String hmsCode;
@ApiModelProperty("房管所名字")
private String hmsName;
@ApiModelProperty("发票id")
private Integer collectionId;
@ApiModelProperty("发票经办人id")
private Integer collectionUserId;
@ApiModelProperty("保证金经办人id")
private Integer bondUserId;
@ApiModelProperty("业务区域类型,0市本级,1其他区域")
private String businessType;
/**
* ---------------------------------------受理------------------------------------
*/
@ApiModelProperty(value = "开户行")
private String bankOpen;
@ApiModelProperty(value = "银行账号")
private String bankAccount;
@ApiModelProperty(value = "处理结果:1通过2不通过")
private String results;
@ApiModelProperty(value = "处理结果内容")
private String resultsContent;
@ApiModelProperty(value = "处理人")
private String resultUserName;
@ApiModelProperty(value = "处理时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date resultsTime;
@ApiModelProperty(value = "是否低保:1是0否")
private String isSubsistence;
/**
* ---------------------------------------生成费用------------------------------------
*/
@ApiModelProperty(value = "租金单价,单位:元")
private BigDecimal rentUnit;
@ApiModelProperty(value = "物业费单价,单位:元")
private BigDecimal propertyUnit;
@ApiModelProperty(value = "月应收租金,单位:元")
private BigDecimal rentMonth;
@ApiModelProperty(value = "月物业费,单位:元")
private BigDecimal propertyMonth;
@ApiModelProperty(value = "月租金(租金+物业费),单位:元")
private BigDecimal rentPropertyMonth;
@ApiModelProperty(value = "预缴租金开始年月,格式:2020-06")
private String advanceStartMonth;
@ApiModelProperty(value = "预缴租金结束年月")
private String advanceEndMonth;
@ApiModelProperty(value = "预缴租金+物业费,单位:元")
private BigDecimal advanceRentProperty;
@ApiModelProperty(value = "装修保证金")
private BigDecimal bondRenovation;
@ApiModelProperty(value = "租赁保证金")
private BigDecimal bondRent;
@ApiModelProperty(value = "水电保证金")
private BigDecimal bondHydropower;
@ApiModelProperty(value = "履约保证金")
private BigDecimal bondPerformance;
@ApiModelProperty(value = "合计费用")
private BigDecimal costTotal;
@ApiModelProperty(value = "费用生成人")
private String genCostUserName;
@ApiModelProperty(value = "费用生成时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date genCostTime;
/**
* ---------------------------------------费用审核------------------------------------
*/
@ApiModelProperty(value = "缴费流水号")
private String outNo;
@ApiModelProperty(value = "缴费订单号")
private String payOrderNo;
@ApiModelProperty(value = "是否完成缴费:1是2否")
private String payIsFinish;
@ApiModelProperty(value = "缴费途径code,字典:支付宝/现金/转账/银行代扣/POS机/公对公转账")
private String payWayCode;
@ApiModelProperty(value = "缴费途径")
private String payWayName;
@ApiModelProperty(value = "财务确认人")
private String checkCostUserName;
@ApiModelProperty(value = "财务确认时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date checkCostTime;
@ApiModelProperty("发票类型:0纸质,1电子")
private String collectionType;
@ApiModelProperty(value = "预缴发票")
private String collectionAdvance;
@ApiModelProperty(value = "装修发票")
private String collectionRenovation;
@ApiModelProperty(value = "租赁发票")
private String collectionRent;
@ApiModelProperty(value = "水电发票")
private String collectionHydropower;
@ApiModelProperty(value = "履约发票")
private String collectionPerformance;
/**
* ---------------------------------------签订合同------------------------------------
*/
@ApiModelProperty(value = "合同ID")
private Integer contractId;
@ApiModelProperty(value = "合同编号")
private String contractCode;
@ApiModelProperty(value = "合同年限")
private Integer contractYears;
@ApiModelProperty(value = "合同起始日期")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date contractStartDate;
@ApiModelProperty(value = "合同截止日期")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date contractEndDate;
@ApiModelProperty(value = "合同到期提前xx天提醒")
private Integer contractExpireRemind;
@ApiModelProperty(value = "合同是否签订,1是2否")
private String contractIsSign;
@ApiModelProperty(value = "合同生成人")
private String genContractUserName;
@ApiModelProperty(value = "合同生成时间")
private Date genContractTime;
@ApiModelProperty("手持身份证照片")
private String holdCardPhoto;
@ApiModelProperty("签名照片")
private String signPhoto;
@ApiModelProperty(value = "合同签订人")
private String signContractUserName;
@ApiModelProperty(value = "合同签订时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signContractTime;
@ApiModelProperty(value = "签订方式")
@KrtActField(name = "签订方式", isJudg = true)
private String signType;
@ApiModelProperty(value = "签字时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date userSignTime;
/**
* ---------------------------------------验房------------------------------------
*/
@ApiModelProperty(value = "验房确认:1合格、2不合格")
private String inspectionResult;
@ApiModelProperty(value = "是否完成验房:1是、0否")
private String inspectionFinish;
@ApiModelProperty(value = "是否移交钥匙:1是、0否")
private String inspectionKey;
@ApiModelProperty(value = "验房人")
private String checkHouseUserName;
@ApiModelProperty(value = "验房时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date checkHouseTime;
/**
* ---------------------------------------申诉------------------------------------
*/
@ApiModelProperty(value = "申诉结果")
private String appealResult;
@ApiModelProperty(value = "申诉经办人")
private String appealUserName;
@ApiModelProperty(value = "申诉时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date appealTime;
/**
* ---------------------------------------放弃承租------------------------------------
*/
@ApiModelProperty(value = "放弃承租经办人")
private String backoutUserName;
@ApiModelProperty(value = "放弃承租时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date backoutTime;
/**
* ---------------------------------------app字段------------------------------------
*/
@ApiModelProperty(value = "app提交")
private String appApply;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty("验房原因")
private String checkHouseReason;
@ApiModelProperty("退回原因")
private String backReason;
@TableField(exist = false)
@ApiModelProperty("保证金id1")
private Integer refundId;
@TableField(exist = false)
@ApiModelProperty("租金id")
private Integer rentId;
}2、创建实体类的目的
在系统管理-->业务流程-->业务流程树管理-->添加业务流程的时候有一个业务类(回调)路径,指定的就是审批数据实体类,类型为业务类时,如果业务类(回调)路径不指定或没有创建实体类的情况下,会出现该业务类不存在.

3、流程Key(可以通过ext_act_flow_biz数据库表查询到)
审核流程中的唯一标识,目的是通过流程Key(act_key)和流程status(act_status)去获取用户的审批环节.
部分代码:
注:因为该业务有导入功能,导入市级和导入县级数据(CheckIn和prhIntoCounty),根据导入的数据不同去走不同的审批流程.
<!-- 带参数查询公租房_批次_中签信息列表 -->
<select id="selectPageListByDTO2" resultType="com.krt.business.vo.PrhBatchWinningListVO">
select
<include refid="columnSql"></include>
s3.advance_id AS advanceId,
s1.assignee_ AS dealId,
s2.act_key AS actKey,
s2.biz_id AS bizId,
s1.proc_inst_id_ AS instanceId,
s1.id_ AS taskId,
s2.pdf_id AS pdfId,
s4.node_action as nodeAction,
s4.node_id as nodeId
from
(select
<include refid="columnSql2"></include>
from prh_batch_winning s1
left join business_into_house s2 on s1.id = s2.winning_id
where 1=1
<if test="organIds!=null and organIds.size()>0">
and s1.hms_code in
<foreach collection="organIds" item="organId" separator="," open="(" close=")">
#{organId}
</foreach>
</if>
<include refid="whereSql"></include>
) s9
left join ( select
pdf_id, code, act_key, act_name, biz_id, name, instance_id, start_user_Id, start_user_name
from ext_act_flow_biz
where act_status = '2' and act_key in('CheckIn','prhIntoCounty')) s2 on s2.biz_id = s9.business_id
left join ( select id_, name_, create_time_, proc_inst_id_, assignee_, task_def_key_ from act_ru_task ) s1 on
s1.proc_inst_id_ = s2.instance_id
left join ( select advance_id, task_id from ext_act_task_log ) s3 on s3.task_id = s1.id_
left join (select node_id,node_action from ext_act_node_set)s4 on s1.task_def_key_ = s4.node_id
</select>二、流程图及节点设置
1、添加模型管理
根据业务去查找所创建业务流程树的流程key.

2、设计流程图

3、配置节点

(1)PC表单:指定的是审批过程中的页面,每一个节点都需要配置表单,便于进入下一个审批页面.
(2)可修改信息:出现该多选框的原因是实体类中加上了@KrtActField注解,目的是在表单中该字段是可修改的.
三、审批范围及审批按钮
1、审批范围
需要配置角色和组织机构
根据我的业务需求(保障实施管理子系统),导入中签数据(prh_batch)的同时,代码会检测房源表(room_housing)中的分配状态,如果房源是未分配和可用空房,那么会获取到房源表中的数据并且存放到中签表中,这时数据经过了一次过滤,拿到了房源表的hms_code字段并插入到中签表中,拿hms_code的目的是通过中签表中的hms_code去比对机构表(sys_organ)中的code,如果是相等的话,那么该角色就是该节点审批人.
(1)因为我的业务审批范围是小区物业经办人,首先我们需要给”小区物业经办人“角色添加数据权限和资源权限

(2)添加组织机构
目的:对应的是哪个组织.


这边机构代码对应的就是中签表中的hms_code.

(3)添加用户账号

2、审批按钮
加上审批按钮的目的是表单回调 退回 提交(进入下一个节点审批)等操作
回调的状态分为:自定义回调和状态回调
自定义回调:通过业务流程树管理添加,在需要进行自己业务处理的情况下使用自定义回调.
状态回调:通过字典添加.系统管理下的字典管理中添加,表单提交回退等状态变更的情况下使用状态回调.

{
title: "业务状态", data: "status",
render: function (data, type, row) {
return handleApplyState(data, row);
}
}, {
title: "操作", data: "id", orderable: false,
"render": function (data, type, row) {
var button = "";
var rowStatus = row.status;
var name = krt.util.getDic("into_house_status", rowStatus);
name = name.replace("待", "");
var button_new = "";
//预处理人
var advanceId = row.advanceId ? row.advanceId.split(",") : [];
//办理人
var dealId = row.dealId;(1)在页面配置按钮功能,根据提交之后的状态去实现不同页面的跳转以及显示的按钮,为什么会走工作流的原因,通过actKey、bizId、instanceId、taskId、pdfId与后台接口进行绑定,从而通过status确定走到哪一步流程.
部分代码:
} else if (row.status == '10') {
if (((dealId === null || dealId === "") && advanceId.indexOf(userId) >= 0) || dealId === userId || userId === '1') {
button += '<@shiro.hasPermission name="businessIntoHouse:businessIntoHouse:examination">'
+ '<button class="btn btn-xs btn-success" onclick="doTask(\'' + row.actKey + '\',\'' + row.bizId + '\',\'' + row.instanceId + '\',\'' + row.taskId + '\',\'' + row.pdfId + '\')">'
+ '<i class="fa fa-check fa-btn"></i>确认费用到账'
+ '</button>'
+ '</@shiro.hasPermission>';
}
button += '<@shiro.hasPermission name="businessIntoHouse:businessIntoHouse:backout">'
+ '<button class="btn btn-xs btn-danger backoutBtn" rid="' + row.id + '">'
+ '<i class="fa fa-close fa-btn"></i>放弃承租'
+ '</button>'
+ '</@shiro.hasPermission>';
button += printCostButton;
} else if (row.status == '11') {
if (((dealId === null || dealId === "") && advanceId.indexOf(userId) >= 0) || dealId === userId || userId === '1') {
button += '<@shiro.hasPermission name="businessIntoHouse:businessIntoHouse:genContrac">'
+ '<button class="btn btn-xs btn-success" onclick="doTask(\'' + row.actKey + '\',\'' + row.bizId + '\',\'' + row.instanceId + '\',\'' + row.taskId + '\',\'' + row.pdfId + '\')">'
+ '<i class="fa fa-check fa-btn"></i>生成合同'
+ '</button>'
+ '</@shiro.hasPermission>';
}(2)在进入工作流之前会先保存业务草稿数据,具体代码:
//非区域版的,进入工作流
flowBusinessService.insertDraft(prhBatch);
actService.autoStartFlow(BusinessNumKeyEnum.GZF_BATCH_AUTH.getActKey(), prhBatch.getId(), 0, "系统导入");(3)审批流程执行的过程中都会经过这一部分代码:
任务审批、流程信息、历史审批、流程图数据
根据processTaskDTO.setUrl(nodeSet.getPcForm());(也就是节点设置PC表单页面路径),获取业务具体走哪个审核流程.
/**
* 任务详情
*
* @param processTaskDTO 办理流程任务dto
* @return String
*/
@GetMapping("act/deal/taskInfo")
public String taskInfo(ProcessTaskDTO processTaskDTO, String flag) {
//1:查看任务 2:办理任务
boolean b = "2".equals(flag) || "1".equals(flag);
Assert.validate(!b, "参数flag错误!");
ExtActNodeSet nodeSet;
String isDoTask = "2";
if (isDoTask.equals(flag)) {
//办理
Task task = taskService.createTaskQuery().taskId(processTaskDTO.getTaskId()).singleResult();
//查询节点
nodeSet = nodeSetService.selectOne(Wrappers.<ExtActNodeSet>lambdaQuery().eq(ExtActNodeSet::getNodeId, task.getTaskDefinitionKey()));
} else {
//查看 返回结束节点的url,而不是审批节点
ExtActModel actModel = actModelService.selectOne(Wrappers.<ExtActModel>lambdaQuery().eq(ExtActModel::getModelKey, processTaskDTO.getActKey()));
Model model = repositoryService.getModel(actModel.getModelId());
//判断是否使用结束节点
String nodeType = GlobalConstant.YesNo.YES.getValue().equals(processTaskDTO.getIsEnd()) ? ActConstant.NodeType.END.getValue() : ActConstant.NodeType.EXAMINE.getValue();
nodeSet = nodeSetService.selectOne(
Wrappers.<ExtActNodeSet>lambdaQuery()
.eq(ExtActNodeSet::getModelId, model.getId())
.eq(ExtActNodeSet::getFlowNodeType, nodeType), false);
}
Assert.isBlank(nodeSet.getPcForm(), "流程表单路径未填写");
processTaskDTO.setUrl(nodeSet.getPcForm());
processTaskDTO.setNodeId(nodeSet.getNodeId());
request.setAttribute("flag", flag);
request.setAttribute("nodeSet", nodeSet);
request.setAttribute("processTaskDTO", processTaskDTO);
return "act/deal/taskInfo";
}