jiazx0107
2026-01-17 cf3b3fe3f9d46e28ac84f1aa61a3d9754aabf421
调整工单审批2
已修改10个文件
已添加2个文件
1614 ■■■■■ 文件已修改
fzzy-igdss-core/src/main/java/com/fzzy/work/data/WorkOrderParam.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/work/domain/WorkOrderProcess.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/work/service/BizWorkService.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/work/service/WorkOrderService.java 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/work/WorkOrder-bak.view.xml 939 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/work/WorkOrder.view.xml 94 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/work/WorkOrderPR.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/pom.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/work/WorkOrderController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/application-dev.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/work/flow-his-bak.html 285 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/work/flow-his.html 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/work/data/WorkOrderParam.java
@@ -14,6 +14,8 @@
@EqualsAndHashCode(callSuper=false)
public class WorkOrderParam {
    public static final String SCOPE_SELF = "self";
    private String companyId;
    private String deptId;
@@ -25,4 +27,7 @@
    private Date start;
    private Date end;
    //获取数据范围-all,self
    private String scope;
}
fzzy-igdss-core/src/main/java/com/fzzy/work/domain/WorkOrderProcess.java
@@ -2,13 +2,11 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
@@ -54,6 +52,7 @@
    @TableField("action")
    private String action;
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", timezone = "GMT+8")
    @Column(name = "create_time")
    @TableField("create_time")
    private Date createTime;
@@ -62,4 +61,8 @@
    @TableField("remark")
    private String remark;
    @Transient
    @TableField(exist = false)
    private String nodeName;
}
fzzy-igdss-core/src/main/java/com/fzzy/work/service/BizWorkService.java
@@ -12,6 +12,7 @@
import com.fzzy.work.domain.WorkOrderConf;
import com.fzzy.work.domain.WorkOrderProcess;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -168,10 +169,20 @@
     */
    public BaseResp todoByProcess(WorkOrderProcess process) {
        String action = process.getAction();
        if (StringUtils.isEmpty(action)) {
            return BaseResp.error("没有识别到处理动作,请重新尝试");
        }
        log.info("-----工单处理-----{}", process);
        //获取工单
        WorkOrder work = orderService.selectById(process.getOrderId());
        if (null == work) return BaseResp.error("当前工单已不存在");
        if (work.getStatus().equals(WorkStatus.STATUS_50.getCode())
                || work.getStatus().equals(WorkStatus.STATUS_60.getCode())) {
            return BaseResp.error("当前工单已处理,请刷新页面重试!!");
        }
        String curNode = process.getNode();
        //获取处理人
@@ -183,8 +194,6 @@
        WorkOrderConf conf = confService.selectById(work.getConfId());
        if (null == conf) return BaseResp.error("当前工单未配置流程");
        String action = process.getAction();
        //添加记录
        process.setId(ContextUtil.UUID());
        process.setCreateTime(new Date());
@@ -204,6 +213,10 @@
            //结束判断,如果是结束节点,则结束工单
            if(WorkNode.NODE_END.getCode().equals(process.getNode())){
                work.setStatus(WorkStatus.STATUS_50.getCode());
                work.setAssigneeName(process.getAssigneeName());
                work.setAssigneeId(process.getAssigneeId());
                orderService.complete(work);
            }
        }
fzzy-igdss-core/src/main/java/com/fzzy/work/service/WorkOrderService.java
@@ -2,11 +2,13 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fzzy.igds.constant.Constant;
import com.fzzy.igds.constant.InoutConstant;
import com.fzzy.igds.mapper.InoutNoticeInMapper;
import com.fzzy.igds.mapper.InoutNoticeOutMapper;
import com.fzzy.igds.utils.ContextUtil;
import com.fzzy.igds.utils.DateUtil;
import com.fzzy.work.data.WorkNode;
import com.fzzy.work.data.WorkStatus;
import com.fzzy.work.data.WorkBizType;
import com.fzzy.work.data.WorkOrderParam;
@@ -54,18 +56,47 @@
        workOrderMapper.insert(data);
    }
    public void pageQuery(Page<WorkOrder> page, WorkOrderParam param) {
    public void pageQueryByUserType(Page<WorkOrder> page, WorkOrderParam param) {
        //获取当前登录人
        SysUser user = ContextUtil.getLoginUser();
        QueryWrapper<WorkOrder> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("company_id", user.getCompanyId());
        if (null == param) {
            param = new WorkOrderParam();
        String scope = param.getScope();
        if (StringUtils.isEmpty(scope)) scope = WorkOrderParam.SCOPE_SELF;
        //监管用户-查看所有库区和待办
        if (Constant.USER_TYPE_10.equals(user.getUserType())) {
            if (WorkOrderParam.SCOPE_SELF.equals(scope)) {
                queryWrapper.eq("node", WorkNode.NODE2.getCode());
            }
        }
        //库区用户,如果是公司用户可以查看公司下属所有库区,如果为当前库区只查询当前库区
        if (Constant.USER_TYPE_30.equals(user.getUserType())) {
            if (ContextUtil.isDepotUser(user.getDeptId() + "")) {
                queryWrapper.eq("dept_id", user.getDeptId() + "");
            } else {
                queryWrapper.likeRight("dept_id", user.getDeptId() + "");
            }
            if (WorkOrderParam.SCOPE_SELF.equals(scope)) {
                queryWrapper.eq("node", WorkNode.NODE1.getCode());
            }
        }
        if (null == param.getCompanyId()) param.setCompanyId(ContextUtil.getCompanyId());
        queryWrapper.eq("company_id", param.getCompanyId());
        //银行用户,根据合同查询银行下所有库区
        if (Constant.USER_TYPE_20.equals(user.getUserType())) {
            //如果没有配置银行,设置一个不存在的银行号
            if (StringUtils.isBlank(user.getUserData())) user.setUserData("9");
            queryWrapper.eq("bank_id", user.getUserData());
            if (WorkOrderParam.SCOPE_SELF.equals(scope)) {
                queryWrapper.eq("node", WorkNode.NODE3.getCode());
            }
        }
        queryWrapper.eq(null != param.getDeptId(), "dept_id", param.getDeptId());
        queryWrapper.like(null != param.getName(), "title", param.getName());
@@ -131,8 +162,8 @@
    }
    public void complete(WorkOrder work) {
        //更新工单状态
        workOrderMapper.updateStatus(work.getId(), work.getStatus());
        //更新工单
        workOrderMapper.updateById(work);
        //更新入库通知单状态
        if (work.getBizType().equals(WorkBizType.TYPE_10.getCode())) {
@@ -144,4 +175,6 @@
            noticeOutMapper.auditComplete(work.getBusinessId(), work.getStatus());
        }
    }
}
fzzy-igdss-view/src/main/java/com/fzzy/work/WorkOrder-bak.view.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,939 @@
<?xml version="1.0" encoding="UTF-8"?>
<ViewConfig>
  <Arguments/>
  <Context/>
  <Model>
    <DataType name="dtMain">
      <Property name="creationType">com.fzzy.work.domain.WorkOrder</Property>
      <PropertyDef name="id">
        <Property></Property>
        <Property name="label">工单ID</Property>
      </PropertyDef>
      <PropertyDef name="title">
        <Property></Property>
        <Property name="label">工单名称</Property>
      </PropertyDef>
      <PropertyDef name="description">
        <Property></Property>
        <Property name="label">工单描述</Property>
      </PropertyDef>
      <PropertyDef name="bizType">
        <Property></Property>
        <Property name="label">工单分类</Property>
        <Property name="mapping">
          <Property name="mapValues">${dorado.getDataProvider(&quot;workOrderPR#triggerBizType&quot;).getResult()}</Property>
          <Property name="keyProperty">dictValue</Property>
          <Property name="valueProperty">dictLabel</Property>
        </Property>
      </PropertyDef>
      <PropertyDef name="status">
        <Property></Property>
        <Property name="label">工单状态</Property>
        <Property name="mapping">
          <Property name="mapValues">${dorado.getDataProvider(&quot;workOrderPR#triggerStatus&quot;).getResult()}</Property>
          <Property name="valueProperty">dictLabel</Property>
          <Property name="keyProperty">dictValue</Property>
        </Property>
      </PropertyDef>
      <PropertyDef name="assigneeId">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="assigneeName">
        <Property></Property>
        <Property name="label">当前处理人</Property>
      </PropertyDef>
      <PropertyDef name="receiveTime">
        <Property name="dataType">DateTime</Property>
        <Property name="label">当前环节接收时间</Property>
      </PropertyDef>
      <PropertyDef name="createTime">
        <Property name="dataType">DateTime</Property>
        <Property name="label">创建时间</Property>
      </PropertyDef>
      <PropertyDef name="createUserId">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="createUserName">
        <Property></Property>
        <Property name="label">创建人</Property>
      </PropertyDef>
      <PropertyDef name="businessId">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="businessUrl">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="remark">
        <Property></Property>
        <Property name="label">备注说明</Property>
      </PropertyDef>
      <PropertyDef name="companyId">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="deptId">
        <Property></Property>
        <Property name="label">所属库区</Property>
        <Property name="mapping">
          <Property name="mapValues">${dorado.getDataProvider(&quot;deptPR#getDeptByUserType&quot;).getResult()}</Property>
          <Property name="keyProperty">id</Property>
          <Property name="valueProperty">kqmc</Property>
        </Property>
      </PropertyDef>
      <PropertyDef name="node">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="createById">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="bankId">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="confId">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="createBy">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="updateBy">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="updateTime">
        <Property name="dataType">Date</Property>
      </PropertyDef>
    </DataType>
    <DataType name="dtParam">
      <Property name="creationType">com.fzzy.work.data.WorkOrderParam</Property>
      <PropertyDef name="companyId">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="deptId">
        <Property></Property>
        <Property name="label">所属库区</Property>
        <Property name="mapping">
          <Property name="mapValues">${dorado.getDataProvider(&quot;deptPR#getDeptByUserType&quot;).getResult()}</Property>
          <Property name="keyProperty">id</Property>
          <Property name="valueProperty">kqmc</Property>
        </Property>
      </PropertyDef>
      <PropertyDef name="name">
        <Property></Property>
        <Property name="label">工单名称</Property>
      </PropertyDef>
      <PropertyDef name="status">
        <Property></Property>
        <Property name="label">工单状态</Property>
      </PropertyDef>
      <PropertyDef name="start">
        <Property name="dataType">Date</Property>
        <Property name="label">开始时间</Property>
      </PropertyDef>
      <PropertyDef name="end">
        <Property name="dataType">Date</Property>
        <Property name="label">截止时间</Property>
      </PropertyDef>
    </DataType>
    <DataType name="dtWordProcess">
      <Property name="creationType">com.fzzy.work.domain.WorkOrderProcess</Property>
      <PropertyDef name="orderId">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="action">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="remark">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="id">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="assigneeId">
        <Property></Property>
      </PropertyDef>
      <PropertyDef name="assigneeName">
        <Property></Property>
        <Property name="label">处理人</Property>
      </PropertyDef>
      <PropertyDef name="node">
        <Property></Property>
        <Property name="label">当前节点</Property>
      </PropertyDef>
      <PropertyDef name="createTime">
        <Property name="dataType">Date</Property>
      </PropertyDef>
    </DataType>
  </Model>
  <View layout="padding:10">
    <ClientEvent name="onReady">query= function(){&#xD;
    var param = view.get(&quot;#dsQuery.data&quot;);&#xD;
    var tabIndex = view.get(&quot;#tabMain.currentIndex&quot;);&#xD;
    if(0 == tabIndex){&#xD;
        view.get(&quot;#dsMain&quot;).set(&quot;parameter&quot;,param).flushAsync();&#xD;
    }else{&#xD;
        view.get(&quot;#dsMain2&quot;).set(&quot;parameter&quot;,param).flushAsync();&#xD;
    }&#xD;
}&#xD;
      &#xD;
//宣传操作&#xD;
renderCell1 = function(arg,self,index){&#xD;
   var data = arg.data;&#xD;
   var htm = &quot;&lt;a onClick='audit()' class='a-btn1'>指派&lt;/a>&amp;nbsp;|&amp;nbsp;&lt;a onClick='showDetail()' class='a-btn2'>详细&lt;/a>&quot;;&#xD;
   if(1 == index){&#xD;
           htm = &quot;&lt;a onClick='showDetail()' class='a-btn2'>详细&lt;/a>&quot;;&#xD;
   }&#xD;
   arg.dom.innerHTML = htm;&#xD;
};&#xD;
&#xD;
renderStatus = function(arg){&#xD;
    var val = arg.data.get(&quot;status&quot;);&#xD;
    var txt = arg.data.getText(&quot;status&quot;);&#xD;
    if(!val) return true;&#xD;
    var htm = &quot;&lt;span class='s1'>&quot;+txt+&quot;&lt;/span>&quot;;&#xD;
    if(val==&quot;20&quot;){//已派单&#xD;
        htm = &quot;&lt;span class='s2'>&quot;+txt+&quot;&lt;/span>&quot;;&#xD;
    }&#xD;
    if(val==&quot;30&quot;){//处理中&#xD;
        htm = &quot;&lt;span class='s4'>&quot;+txt+&quot;&lt;/span>&quot;;&#xD;
    }&#xD;
    if(val==&quot;40&quot;){//已解决&#xD;
        htm = &quot;&lt;span class='s3'>&quot;+txt+&quot;&lt;/span>&quot;;&#xD;
    }&#xD;
    if(val==&quot;50&quot;){//已关闭&#xD;
        htm = &quot;&lt;span class='s3'>&quot;+txt+&quot;&lt;/span>&quot;;&#xD;
    }&#xD;
    if(val==&quot;60&quot;){//挂起&#xD;
        htm = &quot;&lt;span class='s3'>&quot;+txt+&quot;&lt;/span>&quot;;&#xD;
    }&#xD;
    arg.dom.innerHTML = htm;&#xD;
}&#xD;
&#xD;
//点击审核&#xD;
audit = function(){&#xD;
    &#xD;
}&#xD;
//点击详细&#xD;
showDetail = function(){&#xD;
    var tabIndex = view.get(&quot;#tabMain.currentIndex&quot;);&#xD;
    var cur = view.get(&quot;#dsMain.data:#&quot;);&#xD;
    var dialog = view.get(&quot;#dialogMain&quot;);&#xD;
    view.get('^btnTag').set('visible',true);&#xD;
    if(1 == tabIndex){&#xD;
        view.get('^btnTag').set('visible',false);&#xD;
        cur = view.get(&quot;#dsMain2.data:#&quot;);&#xD;
    }&#xD;
    dialog.show();&#xD;
    &#xD;
    var orderId = cur.get(&quot;id&quot;);&#xD;
    //历史数据&#xD;
    view.get('#iFrameFlowHis').set('path','/work/flow-his?orderId='+orderId);&#xD;
    //业务信息&#xD;
    if(cur.get(&quot;businessUrl&quot;)){&#xD;
        var url = cur.get(&quot;businessUrl&quot;)+&quot;?businessId=&quot;+cur.get(&quot;businessId&quot;)+&quot;&amp;orderId=&quot;+orderId;&#xD;
        view.get(&quot;#iFrameBiz&quot;).set(&quot;path&quot;,url);&#xD;
    }else{&#xD;
        view.get(&quot;#iFrameBiz&quot;).set(&quot;path&quot;,&quot;/work/no-business?orderId=&quot;+orderId);&#xD;
    }&#xD;
}&#xD;
//执行审批&#xD;
todo = function(){&#xD;
    var cur = view.get(&quot;#dsMain.data:#&quot;);&#xD;
    var process = view.get(&quot;#dsProcess.data&quot;);&#xD;
    process.set(&quot;orderId&quot;, cur.get(&quot;id&quot;));&#xD;
    process.set(&quot;node&quot;, cur.get(&quot;node&quot;));&#xD;
    var remark = process.get('remark');&#xD;
    if(!remark){&#xD;
        $notify(&quot;请填写审批意见……&quot;);&#xD;
        return;&#xD;
    }&#xD;
    view.get(&quot;#ajaxTodo&quot;).set('parameter',process).execute(function(result){&#xD;
        if('200' != result.code){&#xD;
            $alert(result.message);&#xD;
        }else{&#xD;
            $alert(&quot;执行成功!&quot;);&#xD;
            view.get('#dialogTodo').hide();&#xD;
            query();&#xD;
        }&#xD;
    });&#xD;
}&#xD;
cancelTodo = function(){&#xD;
    var process = view.get(&quot;#dsProcess.data&quot;);&#xD;
    process.set(&quot;action&quot;,null);&#xD;
    process.set('remark',null);&#xD;
    view.get('#dialogTodo').hide();&#xD;
}&#xD;
</ClientEvent>
    <Property name="packages">font-awesome,css-common</Property>
    <DataSet id="dsMain">
      <ClientEvent name="onLoadData">$notify(&quot;数据加载完成……&quot;);</ClientEvent>
      <Property name="dataType">[dtMain]</Property>
      <Property name="dataProvider">workOrderPR#pageQueryByUserType</Property>
      <Property name="pageSize">10</Property>
      <Property name="loadMode">lazy</Property>
    </DataSet>
    <DataSet id="dsMain2">
      <ClientEvent name="onLoadData">$notify(&quot;数据加载完成……&quot;);</ClientEvent>
      <Property name="dataType">[dtMain]</Property>
      <Property name="dataProvider">workOrderPR#pageQuery2</Property>
      <Property name="pageSize">10</Property>
      <Property name="loadMode">lazy</Property>
    </DataSet>
    <DataSet id="dsQuery">
      <ClientEvent name="onReady">self.insert({});</ClientEvent>
      <Property name="dataType">dtParam</Property>
    </DataSet>
    <DataSet id="dsProcess">
      <ClientEvent name="onReady">self.insert();</ClientEvent>
      <Property name="dataType">dtWordProcess</Property>
    </DataSet>
    <HtmlContainer layoutConstraint="top ">
      <Property name="content">&lt;style>&#xD;
.parent {&#xD;
  display: flex;&#xD;
  width: 100%;&#xD;
  background: #FFF;&#xD;
}&#xD;
.console-link-block {&#xD;
    font-size: 16px;&#xD;
    padding: 20px 20px;&#xD;
    border-radius: 4px;&#xD;
    background-color: #40D4B0;&#xD;
    color: #FFFFFF !important;&#xD;
    box-shadow: 0 2px 3px rgba(0, 0, 0, .05);&#xD;
    position: relative;&#xD;
    overflow: hidden;&#xD;
    display: block;&#xD;
}&#xD;
&#xD;
.console-link-block .console-link-block-num {&#xD;
    font-size: 40px;&#xD;
    margin-bottom: 5px;&#xD;
    opacity: .9;&#xD;
}&#xD;
&#xD;
.console-link-block .console-link-block-text {&#xD;
    opacity: .8;&#xD;
}&#xD;
.console-link-block .console-link-block-icon {&#xD;
    position: absolute;&#xD;
    top: 50%;&#xD;
    right: 20px;&#xD;
    width: 50px;&#xD;
    height: 50px;&#xD;
    font-size: 50px;&#xD;
    line-height: 50px;&#xD;
    margin-top: -25px;&#xD;
    color: #FFFFFF;&#xD;
    opacity: .8;&#xD;
}&#xD;
.console-link-block .console-link-block-band {&#xD;
    color: #fff;&#xD;
    width: 100px;&#xD;
    font-size: 12px;&#xD;
    padding: 2px 0 3px 0;&#xD;
    background-color: #E32A16;&#xD;
    line-height: inherit;&#xD;
    text-align: center;&#xD;
    position: absolute;&#xD;
    top: 8px;&#xD;
    right: -30px;&#xD;
    transform-origin: center;&#xD;
    transform: rotate(45deg) scale(.8);&#xD;
    opacity: .95;&#xD;
    z-index: 2;&#xD;
}&#xD;
.bg2{&#xD;
    background-color: #55A5EA;&#xD;
}&#xD;
.bg3{&#xD;
    background-color: #9DAFFF;&#xD;
}&#xD;
.bg4{&#xD;
     background-color: #F591A2;&#xD;
}&#xD;
.bg5{&#xD;
      background-color: #FEAA4F;&#xD;
}&#xD;
.child {&#xD;
  flex: 1;&#xD;
  padding: 10px;&#xD;
  box-sizing: border-box;&#xD;
}&#xD;
.child:last-child {&#xD;
  border-right: none;&#xD;
}&#xD;
.console-icon{&#xD;
    height:50px;&#xD;
    position:absolute;&#xD;
    right:20px;&#xD;
    opacity:.8;&#xD;
    top:50%;&#xD;
    margin-top:-25px;&#xD;
}&#xD;
        &#xD;
&lt;/style>&#xD;
    &#xD;
    &lt;!-- å¿«æ·æ–¹å¼ -->&#xD;
    &lt;div class=&quot;parent&quot;>&#xD;
   &#xD;
        &lt;div class=&quot;child&quot;>&#xD;
            &lt;div class=&quot;console-link-block&quot;>&#xD;
                &lt;div class=&quot;console-link-block-num&quot;>0&lt;/div>&#xD;
                &lt;div class=&quot;console-link-block-text&quot;>今日工单统计&lt;/div>&#xD;
                &lt;img class=&quot;console-icon&quot; src=&quot;/img/icon-wj.png&quot;>&#xD;
            &lt;/div>&#xD;
        &lt;/div>&#xD;
        &#xD;
        &lt;div class=&quot;child&quot;>&#xD;
            &lt;div class=&quot;console-link-block bg2&quot;>&#xD;
                &lt;div class=&quot;console-link-block-num&quot;>0&lt;/div>&#xD;
                &lt;div class=&quot;console-link-block-text&quot;>今日待完成工单&lt;/div>&#xD;
                &lt;img class=&quot;console-icon&quot; src=&quot;/img/icon-wj2.png&quot;>&#xD;
            &lt;/div>&#xD;
        &lt;/div>&#xD;
        &#xD;
        &lt;div class=&quot;child&quot;>&#xD;
            &lt;div class=&quot;console-link-block bg3&quot;>&#xD;
                &lt;div class=&quot;console-link-block-num&quot;>0&lt;/div>&#xD;
                &lt;div class=&quot;console-link-block-text&quot;>总工单统计&lt;/div>&#xD;
                &lt;img class=&quot;console-icon&quot; src=&quot;/img/icon-tj.png&quot;>&#xD;
            &lt;/div>&#xD;
        &lt;/div>&#xD;
        &#xD;
       &lt;div class=&quot;child&quot;>&#xD;
            &lt;div class=&quot;console-link-block bg4&quot;>&#xD;
                &lt;div class=&quot;console-link-block-num&quot;>0&lt;/div>&#xD;
                &lt;div class=&quot;console-link-block-text&quot;>总未完成工单&lt;/div>&#xD;
                &lt;img class=&quot;console-icon&quot; src=&quot;/img/icon-tj2.png&quot;>&#xD;
            &lt;/div>&#xD;
        &lt;/div>&#xD;
        &#xD;
    &lt;/div></Property>
      <Property name="style">
        <Property name="background-color">#FFF</Property>
      </Property>
    </HtmlContainer>
    <Container>
      <Property name="className">c-param</Property>
      <Property name="style">
        <Property name="margin-top">10px</Property>
      </Property>
      <AutoForm>
        <Property name="cols">*,*,*,*,90,90</Property>
        <Property name="dataSet">dsQuery</Property>
        <Property name="labelAlign">right</Property>
        <Property name="labelWidth">100</Property>
        <AutoFormElement>
          <Property name="name">deptId</Property>
          <Property name="property">deptId</Property>
          <Property name="trigger">autoMappingDropDown2</Property>
          <Editor/>
        </AutoFormElement>
        <AutoFormElement>
          <Property name="name">name</Property>
          <Property name="property">name</Property>
          <Editor/>
        </AutoFormElement>
        <AutoFormElement>
          <Property name="name">start</Property>
          <Property name="property">start</Property>
          <Editor/>
        </AutoFormElement>
        <AutoFormElement>
          <Property name="name">end</Property>
          <Property name="property">end</Property>
          <Editor/>
        </AutoFormElement>
        <Button>
          <ClientEvent name="onClick">query();</ClientEvent>
          <Property name="caption">搜索</Property>
          <Property name="iconClass">fa fa-search</Property>
          <Property name="exClassName">btn-q1</Property>
        </Button>
        <Button>
          <ClientEvent name="onClick">view.get(&quot;#dsQuery&quot;).set(&quot;data&quot;,{});</ClientEvent>
          <Property name="caption">重置</Property>
          <Property name="exClassName">btn-q2</Property>
          <Property name="iconClass">fa fa-refresh</Property>
        </Button>
      </AutoForm>
    </Container>
    <Container>
      <Property name="className">c-data</Property>
      <TabControl id="tabMain">
        <ControlTab>
          <Property name="caption">我的工单</Property>
          <Property name="iconClass">fa fa-th-large</Property>
          <Property name="width">150</Property>
          <Container>
            <DataGrid layoutConstraint="padding:8">
              <ClientEvent name="onDataRowClick">self.set(&quot;selection&quot;,arg.data);</ClientEvent>
              <Property name="dataSet">dsMain</Property>
              <Property name="readOnly">true</Property>
              <Property name="selectionMode">singleRow</Property>
              <Property name="readOnly">true</Property>
              <Property name="fixedColumnCount">3</Property>
              <RowSelectorColumn/>
              <RowNumColumn>
                <Property name="width">50</Property>
                <Property name="caption">序号</Property>
              </RowNumColumn>
              <DataColumn>
                <ClientEvent name="onRenderCell">renderCell1(arg,self,0);</ClientEvent>
                <Property name="caption">操作</Property>
                <Property name="width">80</Property>
                <Property name="align">center</Property>
                <Editor/>
              </DataColumn>
              <DataColumn name="id">
                <Property name="property">id</Property>
                <Property name="width">180</Property>
              </DataColumn>
              <DataColumn name="deptId">
                <Property name="property">deptId</Property>
                <Property name="width">250</Property>
              </DataColumn>
              <DataColumn name="title">
                <Property name="property">title</Property>
                <Property name="width">300</Property>
              </DataColumn>
              <DataColumn>
                <ClientEvent name="onRenderCell">renderStatus(arg);</ClientEvent>
                <Property name="property">status</Property>
                <Property name="width">120</Property>
                <Property name="align">center</Property>
                <Property name="name">status</Property>
              </DataColumn>
              <DataColumn name="bizType">
                <Property name="property">bizType</Property>
                <Property name="width">120</Property>
                <Property name="align">center</Property>
              </DataColumn>
              <DataColumn name="assigneeName">
                <Property name="property">assigneeName</Property>
                <Property name="align">center</Property>
                <Property name="width">150</Property>
              </DataColumn>
              <DataColumn name="receiveTime">
                <Property name="property">receiveTime</Property>
                <Property name="width">150</Property>
                <Property name="align">center</Property>
              </DataColumn>
              <DataColumn name="createUserName">
                <Property name="property">createUserName</Property>
                <Property name="align">center</Property>
                <Property name="width">150</Property>
              </DataColumn>
              <DataColumn name="createTime">
                <Property name="property">createTime</Property>
                <Property name="align">center</Property>
                <Property name="width">150</Property>
              </DataColumn>
            </DataGrid>
            <ToolBar layoutConstraint="bottom">
              <Fill/>
              <DataPilot layoutConstraint="right">
                <Property name="itemCodes">pageSize,pages</Property>
                <Property name="dataSet">dsMain</Property>
              </DataPilot>
            </ToolBar>
          </Container>
        </ControlTab>
        <ControlTab>
          <Property name="caption">全部工单</Property>
          <Property name="iconClass">fa fa-history</Property>
          <Property name="width">150</Property>
          <Container>
            <DataGrid layoutConstraint="padding:8">
              <ClientEvent name="onDataRowClick">self.set(&quot;selection&quot;,arg.data);</ClientEvent>
              <Property name="dataSet">dsMain2</Property>
              <Property name="readOnly">true</Property>
              <Property name="selectionMode">singleRow</Property>
              <Property name="readOnly">true</Property>
              <Property name="fixedColumnCount">3</Property>
              <RowSelectorColumn/>
              <RowNumColumn>
                <Property name="width">50</Property>
                <Property name="caption">序号</Property>
              </RowNumColumn>
              <DataColumn>
                <ClientEvent name="onRenderCell">renderCell1(arg,self,1);</ClientEvent>
                <Property name="caption">操作</Property>
                <Property name="width">150</Property>
                <Property name="align">center</Property>
                <Editor/>
              </DataColumn>
              <DataColumn name="id">
                <Property name="property">id</Property>
                <Property name="width">180</Property>
              </DataColumn>
              <DataColumn name="deptId">
                <Property name="property">deptId</Property>
                <Property name="width">250</Property>
              </DataColumn>
              <DataColumn name="title">
                <Property name="property">title</Property>
                <Property name="width">300</Property>
              </DataColumn>
              <DataColumn>
                <ClientEvent name="onRenderCell">renderStatus(arg);</ClientEvent>
                <Property name="property">status</Property>
                <Property name="width">120</Property>
                <Property name="align">center</Property>
                <Property name="name">status</Property>
              </DataColumn>
              <DataColumn name="bizType">
                <Property name="property">bizType</Property>
                <Property name="width">120</Property>
                <Property name="align">center</Property>
              </DataColumn>
              <DataColumn name="assigneeName">
                <Property name="property">assigneeName</Property>
                <Property name="align">center</Property>
                <Property name="width">150</Property>
              </DataColumn>
              <DataColumn name="receiveTime">
                <Property name="property">receiveTime</Property>
                <Property name="width">150</Property>
                <Property name="align">center</Property>
              </DataColumn>
              <DataColumn name="createUserName">
                <Property name="property">createUserName</Property>
                <Property name="align">center</Property>
                <Property name="width">150</Property>
              </DataColumn>
              <DataColumn name="createTime">
                <Property name="property">createTime</Property>
                <Property name="align">center</Property>
                <Property name="width">150</Property>
              </DataColumn>
            </DataGrid>
            <ToolBar layoutConstraint="bottom">
              <Fill/>
              <DataPilot layoutConstraint="right">
                <Property name="itemCodes">pageSize,pages</Property>
                <Property name="dataSet">dsMain2</Property>
              </DataPilot>
            </ToolBar>
          </Container>
        </ControlTab>
      </TabControl>
    </Container>
    <Dialog id="dialogMain" layout="regionPadding:8">
      <Property name="closeable">false</Property>
      <Property name="caption">工单详细</Property>
      <Property name="iconClass">fa fa-tasks</Property>
      <Property name="width">90%</Property>
      <Property name="showCaptionBar">false</Property>
      <Property name="style">
        <Property name="background-color">#e6e6e6</Property>
      </Property>
      <Property name="height">95%</Property>
      <Buttons/>
      <Children>
        <TabControl>
          <ControlTab>
            <Property name="caption">工单信息</Property>
            <Property name="iconClass">fa fa-edit</Property>
            <Property name="width">120</Property>
            <Container>
              <Container>
                <Property name="exClassName">c-data</Property>
                <AutoForm>
                  <Property name="dataSet">dsMain</Property>
                  <Property name="cols">*,*,*</Property>
                  <Property name="labelAlign">right</Property>
                  <Property name="labelSeparator">:</Property>
                  <Property name="labelWidth">100</Property>
                  <Property name="readOnly">true</Property>
                  <AutoFormElement layoutConstraint="colSpan:2">
                    <Property name="name">title</Property>
                    <Property name="property">title</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement>
                    <Property name="name">deptId</Property>
                    <Property name="property">deptId</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement layoutConstraint="colSpan:3">
                    <Property name="name">description</Property>
                    <Property name="property">description</Property>
                    <Property name="editorType">TextArea</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement>
                    <Property name="name">bizType</Property>
                    <Property name="property">bizType</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement>
                    <Property name="name">status</Property>
                    <Property name="property">status</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement>
                    <Property name="name">assigneeName</Property>
                    <Property name="property">assigneeName</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement>
                    <Property name="name">createTime</Property>
                    <Property name="property">createTime</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement>
                    <Property name="name">createUserName</Property>
                    <Property name="property">createUserName</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement>
                    <Property name="name">receiveTime</Property>
                    <Property name="property">receiveTime</Property>
                    <Property name="labelWidth">140</Property>
                    <Editor/>
                  </AutoFormElement>
                </AutoForm>
                <ToolBar>
                  <Fill/>
                  <ToolBarButton>
                    <ClientEvent name="onClick">var process = view.get(&quot;#dsProcess.data&quot;);&#xD;
process.set('action','pass')&#xD;
view.get(&quot;#dialogTodo&quot;).show();</ClientEvent>
                    <Property name="caption">通过</Property>
                    <Property name="width">80</Property>
                    <Property name="exClassName">btn1</Property>
                    <Property name="iconClass">fa fa-check-circle</Property>
                    <Property name="tags">btnTag</Property>
                  </ToolBarButton>
                  <ToolBarButton>
                    <Property name="caption">转交</Property>
                    <Property name="width">80</Property>
                    <Property name="exClassName">btn2</Property>
                    <Property name="iconClass">fa fa-check-circle</Property>
                    <Property name="tags">btnTag</Property>
                  </ToolBarButton>
                  <ToolBarButton>
                    <ClientEvent name="onClick">var process = view.get(&quot;#dsProcess.data&quot;);&#xD;
process.set('action','refuse')&#xD;
view.get(&quot;#dialogTodo&quot;).show();</ClientEvent>
                    <Property name="caption">拒绝</Property>
                    <Property name="width">80</Property>
                    <Property name="exClassName">btn5</Property>
                    <Property name="iconClass">fa fa-check-circle</Property>
                    <Property name="tags">btnTag</Property>
                  </ToolBarButton>
                  <ToolBarButton>
                    <ClientEvent name="onClick">view.get(&quot;#dialogMain&quot;).hide();</ClientEvent>
                    <Property name="caption">关闭</Property>
                    <Property name="width">80</Property>
                    <Property name="exClassName">btn3</Property>
                    <Property name="iconClass">fa fa-times-circle</Property>
                  </ToolBarButton>
                  <Separator>
                    <Property name="width">30</Property>
                  </Separator>
                </ToolBar>
              </Container>
              <IFrame id="iFrameFlowHis">
                <Property name="path">/work/flow-his?orderId=1</Property>
              </IFrame>
            </Container>
          </ControlTab>
          <ControlTab>
            <Property name="caption">业务信息</Property>
            <Property name="iconClass">fa fa-file-o</Property>
            <Property name="width">120</Property>
            <IFrame id="iFrameBiz"/>
          </ControlTab>
        </TabControl>
      </Children>
      <Tools/>
    </Dialog>
    <Dialog id="dialogMain2" layout="regionPadding:8">
      <Property name="closeable">false</Property>
      <Property name="caption">工单详细</Property>
      <Property name="iconClass">fa fa-tasks</Property>
      <Property name="width">90%</Property>
      <Property name="showCaptionBar">false</Property>
      <Property name="style">
        <Property name="background-color">#e6e6e6</Property>
      </Property>
      <Property name="height">95%</Property>
      <Buttons/>
      <Children>
        <TabControl>
          <ControlTab>
            <Property name="caption">工单信息</Property>
            <Property name="iconClass">fa fa-edit</Property>
            <Property name="width">120</Property>
            <Container>
              <Container>
                <Property name="exClassName">c-data</Property>
                <AutoForm>
                  <Property name="dataSet">dsMain</Property>
                  <Property name="cols">*,*,*</Property>
                  <Property name="labelAlign">right</Property>
                  <Property name="labelSeparator">:</Property>
                  <Property name="labelWidth">100</Property>
                  <Property name="readOnly">true</Property>
                  <AutoFormElement layoutConstraint="colSpan:2">
                    <Property name="name">title</Property>
                    <Property name="property">title</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement>
                    <Property name="name">deptId</Property>
                    <Property name="property">deptId</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement layoutConstraint="colSpan:3">
                    <Property name="name">description</Property>
                    <Property name="property">description</Property>
                    <Property name="editorType">TextArea</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement>
                    <Property name="name">bizType</Property>
                    <Property name="property">bizType</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement>
                    <Property name="name">status</Property>
                    <Property name="property">status</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement>
                    <Property name="name">assigneeName</Property>
                    <Property name="property">assigneeName</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement>
                    <Property name="name">createTime</Property>
                    <Property name="property">createTime</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement>
                    <Property name="name">createUserName</Property>
                    <Property name="property">createUserName</Property>
                    <Editor/>
                  </AutoFormElement>
                  <AutoFormElement>
                    <Property name="name">receiveTime</Property>
                    <Property name="property">receiveTime</Property>
                    <Property name="labelWidth">140</Property>
                    <Editor/>
                  </AutoFormElement>
                </AutoForm>
                <ToolBar>
                  <Fill/>
                  <ToolBarButton>
                    <ClientEvent name="onClick">var process = view.get(&quot;#dsProcess.data&quot;);&#xD;
process.set('action','pass')&#xD;
view.get(&quot;#dialogTodo&quot;).show();</ClientEvent>
                    <Property name="caption">通过</Property>
                    <Property name="width">80</Property>
                    <Property name="exClassName">btn1</Property>
                    <Property name="iconClass">fa fa-check-circle</Property>
                    <Property name="tags">btnTag</Property>
                  </ToolBarButton>
                  <ToolBarButton>
                    <Property name="caption">转交</Property>
                    <Property name="width">80</Property>
                    <Property name="exClassName">btn2</Property>
                    <Property name="iconClass">fa fa-check-circle</Property>
                    <Property name="tags">btnTag</Property>
                  </ToolBarButton>
                  <ToolBarButton>
                    <ClientEvent name="onClick">var process = view.get(&quot;#dsProcess.data&quot;);&#xD;
process.set('action','refuse')&#xD;
view.get(&quot;#dialogTodo&quot;).show();</ClientEvent>
                    <Property name="caption">拒绝</Property>
                    <Property name="width">80</Property>
                    <Property name="exClassName">btn5</Property>
                    <Property name="iconClass">fa fa-check-circle</Property>
                    <Property name="tags">btnTag</Property>
                  </ToolBarButton>
                  <ToolBarButton>
                    <ClientEvent name="onClick">view.get(&quot;#dialogMain&quot;).hide();</ClientEvent>
                    <Property name="caption">关闭</Property>
                    <Property name="width">80</Property>
                    <Property name="exClassName">btn3</Property>
                    <Property name="iconClass">fa fa-times-circle</Property>
                  </ToolBarButton>
                  <Separator>
                    <Property name="width">30</Property>
                  </Separator>
                </ToolBar>
              </Container>
              <IFrame id="iFrameFlowHis">
                <Property name="path">/work/flow-his?orderId=1</Property>
              </IFrame>
            </Container>
          </ControlTab>
          <ControlTab>
            <Property name="caption">业务信息</Property>
            <Property name="iconClass">fa fa-file-o</Property>
            <Property name="width">120</Property>
            <IFrame id="iFrameBiz"/>
          </ControlTab>
        </TabControl>
      </Children>
      <Tools/>
    </Dialog>
    <UpdateAction id="updateSave">
      <UpdateItem>
        <Property name="dataPath">[#current]</Property>
        <Property name="dataSet">dsMain</Property>
      </UpdateItem>
    </UpdateAction>
    <AjaxAction id="ajaxDel">
      <Property name="confirmMessage">确定要执行删除么?</Property>
    </AjaxAction>
    <Dialog id="dialogTodo">
      <Property name="width">600</Property>
      <Property name="caption">审批处理</Property>
      <Property name="closeable">false</Property>
      <Property name="iconClass">fa fa-bookmark</Property>
      <Buttons>
        <Button>
          <ClientEvent name="onClick">todo();</ClientEvent>
          <Property name="caption">确定</Property>
          <Property name="iconClass">fa fa-check</Property>
          <Property name="exClassName">btn1</Property>
          <Property name="width">90</Property>
        </Button>
        <Button>
          <ClientEvent name="onClick">cancelTodo();</ClientEvent>
          <Property name="caption">取消</Property>
          <Property name="iconClass">fa fa-times</Property>
          <Property name="exClassName">btn3</Property>
          <Property name="width">90</Property>
        </Button>
      </Buttons>
      <Children>
        <Container>
          <AutoForm>
            <Property name="cols">*</Property>
            <Property name="dataSet">dsProcess</Property>
            <AutoFormElement>
              <Property name="name">remark</Property>
              <Property name="property">remark</Property>
              <Property name="showHint">false</Property>
              <Property name="showLabel">false</Property>
              <Editor>
                <TextArea>
                  <Property name="blankText">-- å¡«å†™å®¡æ‰¹å»ºè®® --</Property>
                  <Property name="height">100</Property>
                </TextArea>
              </Editor>
            </AutoFormElement>
          </AutoForm>
        </Container>
      </Children>
      <Tools/>
    </Dialog>
    <AjaxAction id="ajaxTodo">
      <Property name="service">workOrderPR#todo</Property>
      <Property name="executingMessage">处理中……</Property>
    </AjaxAction>
  </View>
</ViewConfig>
fzzy-igdss-view/src/main/java/com/fzzy/work/WorkOrder.view.xml
@@ -131,6 +131,9 @@
        <Property name="dataType">Date</Property>
        <Property name="label">截止时间</Property>
      </PropertyDef>
      <PropertyDef name="scope">
        <Property/>
      </PropertyDef>
    </DataType>
    <DataType name="dtWordProcess">
      <Property name="creationType">com.fzzy.work.domain.WorkOrderProcess</Property>
@@ -163,20 +166,26 @@
    </DataType>
  </Model>
  <View layout="padding:10">
    <ClientEvent name="onReady">query= function(){&#xD;
    <ClientEvent name="onReady">view.TAG = 1;&#xD;
query= function(){&#xD;
    var param = view.get(&quot;#dsQuery.data&quot;);&#xD;
    var tabIndex = view.get(&quot;#tabMain.currentIndex&quot;);&#xD;
    param.set(&quot;scope&quot;,&quot;all&quot;);&#xD;
    if(0 == tabIndex){&#xD;
        param.set(&quot;scope&quot;,&quot;self&quot;);&#xD;
    }&#xD;
        view.get(&quot;#dsMain&quot;).set(&quot;parameter&quot;,param).flushAsync();&#xD;
    }else{&#xD;
        view.get(&quot;#dsMain2&quot;).set(&quot;parameter&quot;,param).flushAsync();&#xD;
    }&#xD;
}&#xD;
query();&#xD;
      &#xD;
//宣传操作&#xD;
renderCell1 = function(arg,self){&#xD;
   var tabIndex = view.get(&quot;#tabMain.currentIndex&quot;);&#xD;
   var data = arg.data;&#xD;
   var htm = &quot;&lt;a onClick='audit()' class='a-btn1'>指派&lt;/a>&amp;nbsp;|&amp;nbsp;&lt;a onClick='showDetail()' class='a-btn2'>详细&lt;/a>&quot;;&#xD;
   if(1 == tabIndex){&#xD;
           htm = &quot;&lt;a onClick='showDetail()' class='a-btn2'>详细&lt;/a>&quot;;&#xD;
   }&#xD;
   arg.dom.innerHTML = htm;&#xD;
};&#xD;
&#xD;
@@ -212,8 +221,9 @@
    var tabIndex = view.get(&quot;#tabMain.currentIndex&quot;);&#xD;
    var cur = view.get(&quot;#dsMain.data:#&quot;);&#xD;
    var dialog = view.get(&quot;#dialogMain&quot;);&#xD;
    view.get('^btnTag').set('visible',true);&#xD;
    if(1 == tabIndex){&#xD;
        cur = view.get(&quot;#dsMain2.data:#&quot;);&#xD;
        view.get('^btnTag').set('visible',false);&#xD;
    }&#xD;
    dialog.show();&#xD;
    &#xD;
@@ -229,13 +239,11 @@
    }&#xD;
}&#xD;
//执行审批&#xD;
todo = function(action){&#xD;
todo = function(){&#xD;
    var cur = view.get(&quot;#dsMain.data:#&quot;);&#xD;
    var process = view.get(&quot;#dsProcess.data&quot;);&#xD;
    process.set(&quot;orderId&quot;, cur.get(&quot;id&quot;));&#xD;
    process.set(&quot;action&quot;, action);&#xD;
    process.set(&quot;node&quot;, cur.get(&quot;node&quot;));&#xD;
    &#xD;
    var remark = process.get('remark');&#xD;
    if(!remark){&#xD;
        $notify(&quot;请填写审批意见……&quot;);&#xD;
@@ -243,15 +251,17 @@
    }&#xD;
    view.get(&quot;#ajaxTodo&quot;).set('parameter',process).execute(function(result){&#xD;
        if('200' != result.code){&#xD;
            $alert(result.msg);&#xD;
            $alert(result.message);&#xD;
        }else{&#xD;
            $alert(&quot;执行成功!&quot;);&#xD;
            view.get('#dialogTodo').hide();&#xD;
            query();&#xD;
        }&#xD;
    });&#xD;
}&#xD;
cancelTodo = function(){&#xD;
    var process = view.get(&quot;#dsProcess.data&quot;);&#xD;
    process.set(&quot;action&quot;,null);&#xD;
    process.set('remark',null);&#xD;
    view.get('#dialogTodo').hide();&#xD;
}&#xD;
@@ -260,16 +270,9 @@
    <DataSet id="dsMain">
      <ClientEvent name="onLoadData">$notify(&quot;数据加载完成……&quot;);</ClientEvent>
      <Property name="dataType">[dtMain]</Property>
      <Property name="dataProvider">workOrderPR#pageQuery</Property>
      <Property name="dataProvider">workOrderPR#pageQueryByUserType</Property>
      <Property name="pageSize">10</Property>
      <Property name="loadMode">lazy</Property>
    </DataSet>
    <DataSet id="dsMain2">
      <ClientEvent name="onLoadData">$notify(&quot;数据加载完成……&quot;);</ClientEvent>
      <Property name="dataType">[dtMain]</Property>
      <Property name="dataProvider">workOrderPR#pageQuery2</Property>
      <Property name="pageSize">10</Property>
      <Property name="loadMode">lazy</Property>
      <Property name="loadMode">manual</Property>
    </DataSet>
    <DataSet id="dsQuery">
      <ClientEvent name="onReady">self.insert({});</ClientEvent>
@@ -454,8 +457,9 @@
    <Container>
      <Property name="className">c-data</Property>
      <TabControl id="tabMain">
        <ClientEvent name="onTabChange">if(view.TAG) query();</ClientEvent>
        <ControlTab>
          <Property name="caption">全部</Property>
          <Property name="caption">我的工单</Property>
          <Property name="iconClass">fa fa-th-large</Property>
          <Property name="width">150</Property>
          <Container>
@@ -474,7 +478,7 @@
              <DataColumn>
                <ClientEvent name="onRenderCell">renderCell1(arg,self);</ClientEvent>
                <Property name="caption">操作</Property>
                <Property name="width">150</Property>
                <Property name="width">80</Property>
                <Property name="align">center</Property>
                <Editor/>
              </DataColumn>
@@ -533,13 +537,13 @@
          </Container>
        </ControlTab>
        <ControlTab>
          <Property name="caption">已结束</Property>
          <Property name="caption">全部工单</Property>
          <Property name="iconClass">fa fa-history</Property>
          <Property name="width">150</Property>
          <Container>
            <DataGrid layoutConstraint="padding:8">
              <ClientEvent name="onDataRowClick">self.set(&quot;selection&quot;,arg.data);</ClientEvent>
              <Property name="dataSet">dsMain2</Property>
              <Property name="dataSet">dsMain</Property>
              <Property name="readOnly">true</Property>
              <Property name="selectionMode">singleRow</Property>
              <Property name="readOnly">true</Property>
@@ -605,7 +609,7 @@
              <Fill/>
              <DataPilot layoutConstraint="right">
                <Property name="itemCodes">pageSize,pages</Property>
                <Property name="dataSet">dsMain2</Property>
                <Property name="dataSet">dsMain</Property>
              </DataPilot>
            </ToolBar>
          </Container>
@@ -690,22 +694,34 @@
                <ToolBar>
                  <Fill/>
                  <ToolBarButton>
                    <ClientEvent name="onClick">view.get(&quot;#dialogTodo&quot;).show();&#xD;
</ClientEvent>
                    <Property name="caption">处理</Property>
                    <ClientEvent name="onClick">var process = view.get(&quot;#dsProcess.data&quot;);&#xD;
process.set('action','pass')&#xD;
view.get(&quot;#dialogTodo&quot;).show();</ClientEvent>
                    <Property name="caption">通过</Property>
                    <Property name="width">80</Property>
                    <Property name="exClassName">btn1</Property>
                    <Property name="iconClass">fa fa-check-circle</Property>
                    <Property name="tags">btnTag</Property>
                  </ToolBarButton>
                  <ToolBarButton>
                    <Property name="caption">转交</Property>
                    <Property name="width">80</Property>
                    <Property name="exClassName">btn2</Property>
                    <Property name="iconClass">fa fa-check-circle</Property>
                    <Property name="tags">btnTag</Property>
                  </ToolBarButton>
                  <ToolBarButton>
                    <ClientEvent name="onClick">view.get(&quot;#dsMain.data:#&quot;).cancel();&#xD;
view.get(&quot;#dialogMain&quot;).hide();</ClientEvent>
                    <ClientEvent name="onClick">var process = view.get(&quot;#dsProcess.data&quot;);&#xD;
process.set('action','refuse')&#xD;
view.get(&quot;#dialogTodo&quot;).show();</ClientEvent>
                    <Property name="caption">拒绝</Property>
                    <Property name="width">80</Property>
                    <Property name="exClassName">btn5</Property>
                    <Property name="iconClass">fa fa-check-circle</Property>
                    <Property name="tags">btnTag</Property>
                  </ToolBarButton>
                  <ToolBarButton>
                    <ClientEvent name="onClick">view.get(&quot;#dialogMain&quot;).hide();</ClientEvent>
                    <Property name="caption">关闭</Property>
                    <Property name="width">80</Property>
                    <Property name="exClassName">btn3</Property>
@@ -731,15 +747,6 @@
      </Children>
      <Tools/>
    </Dialog>
    <UpdateAction id="updateSave">
      <UpdateItem>
        <Property name="dataPath">[#current]</Property>
        <Property name="dataSet">dsMain</Property>
      </UpdateItem>
    </UpdateAction>
    <AjaxAction id="ajaxDel">
      <Property name="confirmMessage">确定要执行删除么?</Property>
    </AjaxAction>
    <Dialog id="dialogTodo">
      <Property name="width">600</Property>
      <Property name="caption">审批处理</Property>
@@ -747,22 +754,15 @@
      <Property name="iconClass">fa fa-bookmark</Property>
      <Buttons>
        <Button>
          <ClientEvent name="onClick">todo('pass');</ClientEvent>
          <Property name="caption">通过</Property>
          <ClientEvent name="onClick">todo();</ClientEvent>
          <Property name="caption">确定</Property>
          <Property name="iconClass">fa fa-check</Property>
          <Property name="exClassName">btn1</Property>
          <Property name="width">90</Property>
        </Button>
        <Button>
          <ClientEvent name="onClick">todo('refuse');</ClientEvent>
          <Property name="caption">拒绝</Property>
          <Property name="exClassName">btn4</Property>
          <Property name="iconClass">fa fa-times</Property>
          <Property name="width">90</Property>
        </Button>
        <Button>
          <ClientEvent name="onClick">cancelTodo();</ClientEvent>
          <Property name="caption">取消操作</Property>
          <Property name="caption">取消</Property>
          <Property name="iconClass">fa fa-times</Property>
          <Property name="exClassName">btn3</Property>
          <Property name="width">90</Property>
fzzy-igdss-view/src/main/java/com/fzzy/work/WorkOrderPR.java
@@ -17,6 +17,7 @@
import com.fzzy.work.service.WorkOrderService;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.domain.entity.SysUser;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
@@ -42,44 +43,19 @@
    private BizWorkService bizWorkService;
    /**
     *
     * workOrderPR#pageQuery
     * åˆ†é¡µæŸ¥è¯¢
     * @param page
     * @param param
     * æ ¹æ®ç”¨æˆ·è§’色选择不同的工单信息
     * @param page åˆ†é¡µä¿¡æ¯
     * @param param å‚æ•°
     */
    @DataProvider
    public void pageQuery(Page<WorkOrder> page, WorkOrderParam param) {
    public void pageQueryByUserType(Page<WorkOrder> page, WorkOrderParam param) {
        com.baomidou.mybatisplus.extension.plugins.pagination.Page<WorkOrder> corePage = new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(page.getPageNo(), page.getPageSize());
        if (null == param) param = new WorkOrderParam();
        param.setCompanyId(ContextUtil.getCompanyId());
        workOrderService.pageQuery(corePage, param);
        // é‡æ–°å°è£…
        page.setEntities(corePage.getRecords());
        page.setEntityCount(Integer.parseInt(String.valueOf(corePage.getTotal())));
    }
    /**
     *
     * workOrderPR#pageQuery2
     * å·²ç»å®Œæˆï¼Œåˆ†é¡µæŸ¥è¯¢
     * @param page
     * @param param
     */
    @DataProvider
    public void pageQuery2(Page<WorkOrder> page, WorkOrderParam param) {
        com.baomidou.mybatisplus.extension.plugins.pagination.Page<WorkOrder> corePage = new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(page.getPageNo(), page.getPageSize());
        if (null == param) param = new WorkOrderParam();
        param.setStatus(WorkStatus.STATUS_50.getCode());
        param.setCompanyId(ContextUtil.getCompanyId());
        workOrderService.pageQuery(corePage, param);
        workOrderService.pageQueryByUserType(corePage, param);
        // é‡æ–°å°è£…
        page.setEntities(corePage.getRecords());
fzzy-igdss-web/pom.xml
@@ -57,12 +57,13 @@
            <version>${fzzy.igdss.version}</version>
        </dependency>
        <!-- æŽ¥å£æ¨¡å—-->
        <!-- æŽ¥å£æ¨¡å—
        <dependency>
            <groupId>com.fzzy</groupId>
            <artifactId>fzzy-igdss-inte</artifactId>
            <version>${fzzy.igdss.version}</version>
        </dependency>
        -->
    </dependencies>
fzzy-igdss-web/src/main/java/com/fzzy/work/WorkOrderController.java
@@ -1,8 +1,12 @@
package com.fzzy.work;
import com.fzzy.igds.utils.DateUtil;
import com.fzzy.work.domain.WorkOrderConf;
import com.fzzy.work.domain.WorkOrderProcess;
import com.fzzy.work.service.WorkOrderConfService;
import com.fzzy.work.service.WorkOrderProcessService;
import com.ruoyi.common.core.controller.BaseController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
@@ -10,10 +14,13 @@
import org.springframework.web.bind.annotation.RequestParam;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
 * å·¥å•管理
 */
@Slf4j
@Controller
@RequestMapping("/work")
public class WorkOrderController extends BaseController {
@@ -23,6 +30,8 @@
    @Resource
    private WorkOrderConfService workOrderConfService;
    @Resource
    private WorkOrderProcessService workOrderProcessService;
    /**
@@ -69,8 +78,18 @@
     */
    @GetMapping("/flow-his")
    public String flowHis(@RequestParam("orderId") String orderId, ModelMap mmap) {
        log.info("工单记录-工单ID:{}", orderId);
        List<WorkOrderProcess> list = workOrderProcessService.queryList(orderId);
        mmap.put("list", list);
        mmap.put("tipTime", 1);
        mmap.put("tipCount", 1);
        mmap.put("list", null);
        if (null != list && !list.isEmpty()) {
            //次数默认减去第一次提交
            mmap.put("tipCount", list.size() - 1);
            long tipTime = DateUtil.difMin(list.get(0).getCreateTime(), new Date());
            mmap.put("tipTime", tipTime);
        }
        return prefix + "/flow-his";
    }
fzzy-igdss-web/src/main/resources/application-dev.yml
@@ -71,7 +71,7 @@
  # Redis相关配置
  redis:
    database: 0
    database: 2
    host: 127.0.0.1
    port: 6379
    password:
fzzy-igdss-web/src/main/resources/templates/work/flow-his-bak.html
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,285 @@
<!DOCTYPE html>
<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>工单处理历史记录</title>
    <link rel="stylesheet" th:href="@{/ajax/libs/layui-ruoyi/css/layui.css}"/>
    <style>
        /* éšè—æ»šåŠ¨æ¡çš„åŸºç¡€CSS */
        .hide-scrollbar {
            /* éšè—æ ‡å‡†æ»šåŠ¨æ¡ */
            scrollbar-width: none; /* Firefox */
            -ms-overflow-style: none; /* IE å’Œ Edge */
        }
        /* Chrome, Safari å’Œ Opera */
        .hide-scrollbar::-webkit-scrollbar {
            display: none;
        }
        /* å¹³æ»‘滚动效果 */
        .smooth-scroll {
            scroll-behavior: smooth;
        }
        html{
            overflow: hidden ;
        }
        /* é¡µé¢åŸºç¡€æ ·å¼ */
        body {
            background-color: #FFF;
            padding: 20px;
            font-family: "Microsoft YaHei", Arial, sans-serif;
            font-size: 14px;
            overflow-x: hidden;
        }
        .container {
            margin: 0 auto;
            background-color: #fff;
            border-radius: 8px;
            box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
            overflow: hidden;
        }
        .header {
            background-color: #e6e6e6;
            padding: 15px;
            font-weight: bold;
        }
        .summary-box {
            margin: 20px;
            padding: 15px;
            background-color: #f0f9ff;
            border-left: 4px solid #1E9FFF;
            border-radius: 4px;
            font-size: 14px;
        }
        .summary-box .layui-icon {
            margin-right: 8px;
            color: #1E9FFF;
        }
        .timeline-container {
            padding: 0 20px 20px;
        }
        /* è‡ªå®šä¹‰æ—¶é—´è½´æ ·å¼ */
        .custom-timeline {
            position: relative;
            padding: 20px 0;
        }
        .custom-timeline:before {
            content: '';
            position: absolute;
            left: 18px;
            top: 0;
            bottom: 0;
            width: 2px;
            background-color: #e8e8e8;
        }
        .timeline-item {
            position: relative;
            padding-left: 50px;
            margin-bottom: 25px;
        }
        .timeline-item:last-child {
            margin-bottom: 0;
        }
        .timeline-icon {
            position: absolute;
            left: 0;
            top: 0;
            width: 38px;
            height: 38px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            color: white;
            z-index: 2;
        }
        .timeline-content {
            background-color: #f9f9f9;
            border-radius: 6px;
            padding: 15px;
            border-left: 3px solid #1E9FFF;
            font-size: 14px;
        }
        .operator-info {
            font-weight: bold;
            color: #333;
            margin-bottom: 5px;
        }
        .status-change {
            color: #666;
            margin-bottom: 5px;
        }
        .status-description {
            color: #888;
            font-size: 13px;
        }
        .time-info {
            text-align: right;
            color: #999;
            font-size: 13px;
            margin-top: 8px;
        }
        /* ä¸åŒçŠ¶æ€çš„å›¾æ ‡é¢œè‰² */
        .status-created { background-color: #FFB800; }
        .status-waiting { background-color: #FF5722; }
        .status-processing { background-color: #1E9FFF; }
        .status-completed { background-color: #009688; }
        /* å¯æ»šåŠ¨åŒºåŸŸæ ·å¼ */
        .scrollable-area {
            max-height: 400px; /* è®¾ç½®æœ€å¤§é«˜åº¦ */
            overflow-y: auto; /* åž‚直方向允许滚动 */
            overflow-x: hidden; /* æ°´å¹³æ–¹å‘隐藏 */
        }
        /* æ–¹æ³•1:完全隐藏滚动条 */
        .method-1 {
            scrollbar-width: none; /* Firefox */
            -ms-overflow-style: none; /* IE å’Œ Edge */
        }
        .method-1::-webkit-scrollbar {
            display: none; /* Chrome, Safari å’Œ Opera */
        }
        /* å“åº”式调整 */
        @media (max-width: 768px) {
            .container {
                margin: 10px;
            }
            .timeline-item {
                padding-left: 40px;
            }
            .timeline-icon {
                width: 32px;
                height: 32px;
            }
            .scrollable-area {
                max-height: 300px; /* ç§»åŠ¨ç«¯è°ƒæ•´é«˜åº¦ */
            }
        }
        /* é¢å¤–的工单记录用于演示滚动 */
        .extra-records {
            display: none;
        }
    </style>
</head>
<body>
<div class="container">
<!--    <div class="header">-->
<!--        <i class="layui-icon layui-icon-form"></i> å·¥å•处理记录-->
<!--    </div>-->
    <div class="summary-box">
        <i class="layui-icon layui-icon-tips"></i>
        å¤„理记录:该工单累计处理时长 <span style="color:#1E9FFF; font-weight:bold;" th:text="${tipTime}">1分钟</span>,累计处理次数 <span style="color:#1E9FFF; font-weight:bold;" th:text="${tipCount}">1次</span>
    </div>
    <div class="timeline-container">
        <!-- è¿™é‡Œæ˜¯å¯æ»šåŠ¨çš„æ—¶é—´è½´åŒºåŸŸ -->
        <div class="custom-timeline scrollable-area method-1 smooth-scroll" id="timelineScroll">
            <!-- å·²å®Œæˆ -->
            <div class="timeline-item">
                <div class="timeline-icon status-completed">
                    <i class="layui-icon layui-icon-ok"></i>
                </div>
                <div class="timeline-content">
                    <div class="operator-info">经办人 æŸ³ç™½</div>
                    <div class="status-change">将工单状态设置为 å·²å®Œæˆ</div>
                    <div class="time-info">2026-01-06 13:56:21</div>
                </div>
            </div>
            <!-- å¤„理中 -->
            <div class="timeline-item">
                <div class="timeline-icon status-processing">
                    <i class="layui-icon layui-icon-loading"></i>
                </div>
                <div class="timeline-content">
                    <div class="operator-info">经办人 æŸ³ç™½</div>
                    <div class="status-change">将工单状态设置为 å¤„理中</div>
                    <div class="status-description">已接收工单</div>
                    <div class="time-info">2026-01-06 13:56:01</div>
                </div>
            </div>
            <!-- å¾…接收 -->
            <div class="timeline-item">
                <div class="timeline-icon status-waiting">
                    <i class="layui-icon layui-icon-user"></i>
                </div>
                <div class="timeline-content">
                    <div class="operator-info">经办人 æŸ³ç™½</div>
                    <div class="status-change">将工单状态设置为 å¾…接收,下个受理人为 æŸ³ç™½</div>
                    <div class="time-info">2026-01-06 13:55:20</div>
                </div>
            </div>
            <!-- æ–°å»ºå·¥å• -->
            <div class="timeline-item">
                <div class="timeline-icon status-created">
                    <i class="layui-icon layui-icon-add-circle"></i>
                </div>
                <div class="timeline-content">
                    <div class="status-change">新建工单</div>
                    <div class="status-description">公众号·WGCLOUD</div>
                    <div class="time-info">2026-01-06 13:55:00</div>
                </div>
            </div>
            <!-- ä»¥ä¸‹ä¸ºé¢å¤–记录,用于演示滚动效果 -->
            <div class="extra-records">
                <!-- é¢å¤–记录1 -->
                <div class="timeline-item">
                    <div class="timeline-icon status-waiting">
                        <i class="layui-icon layui-icon-user"></i>
                    </div>
                    <div class="timeline-content">
                        <div class="operator-info">系统自动</div>
                        <div class="status-change">工单已创建,等待分配</div>
                        <div class="time-info">2026-01-06 13:54:30</div>
                    </div>
                </div>
                <!-- é¢å¤–记录2 -->
                <div class="timeline-item">
                    <div class="timeline-icon status-waiting">
                        <i class="layui-icon layui-icon-notice"></i>
                    </div>
                    <div class="timeline-content">
                        <div class="operator-info">系统自动</div>
                        <div class="status-change">发送工单创建通知</div>
                        <div class="time-info">2026-01-06 13:54:15</div>
                    </div>
                </div>
                <!-- é¢å¤–记录3 -->
                <div class="timeline-item">
                    <div class="timeline-icon status-completed">
                        <i class="layui-icon layui-icon-ok"></i>
                    </div>
                    <div class="timeline-content">
                        <div class="operator-info">用户提交</div>
                        <div class="status-change">工单提交成功</div>
                        <div class="status-description">用户通过Web端提交工单</div>
                        <div class="time-info">2026-01-06 13:54:00</div>
                    </div>
                </div>
                <!-- é¢å¤–记录4 -->
                <div class="timeline-item">
                    <div class="timeline-icon status-created">
                        <i class="layui-icon layui-icon-edit"></i>
                    </div>
                    <div class="timeline-content">
                        <div class="operator-info">用户 å¼ ä¸‰</div>
                        <div class="status-change">填写工单信息</div>
                        <div class="status-description">问题描述:公众号无法正常登录</div>
                        <div class="time-info">2026-01-06 13:53:45</div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
</body>
</html>
fzzy-igdss-web/src/main/resources/templates/work/flow-his.html
@@ -121,12 +121,10 @@
            color: #333;
            margin-bottom: 5px;
        }
        .status-change {
            color: #666;
            margin-bottom: 5px;
        }
        .status-description {
            color: #888;
            font-size: 13px;
@@ -140,10 +138,21 @@
        }
        /* ä¸åŒçŠ¶æ€çš„å›¾æ ‡é¢œè‰² */
        .status-created { background-color: #FFB800; }
        .status-waiting { background-color: #FF5722; }
        .status-processing { background-color: #1E9FFF; }
        .status-completed { background-color: #009688; }
        .status-created {
            background-color: #FFB800;
        }
        .status-waiting {
            background-color: #FF5722;
        }
        .status-processing {
            background-color: #1E9FFF;
        }
        .status-completed {
            background-color: #009688;
        }
        /* å¯æ»šåŠ¨åŒºåŸŸæ ·å¼ */
        .scrollable-area {
@@ -167,21 +176,26 @@
            .container {
                margin: 10px;
            }
            .timeline-item {
                padding-left: 40px;
            }
            .timeline-icon {
                width: 32px;
                height: 32px;
            }
            .scrollable-area {
                max-height: 300px; /* ç§»åŠ¨ç«¯è°ƒæ•´é«˜åº¦ */
            }
        }
        /* é¢å¤–的工单记录用于演示滚动 */
        /* é¢å¤–的工单记录用于演示滚动
        .extra-records {
            display: none;
        }
        */
    </style>
</head>
<body>
@@ -191,13 +205,14 @@
<!--    </div>-->
    <div class="summary-box">
        <i class="layui-icon layui-icon-tips"></i>
        å¤„理记录:该工单累计处理时长 <span style="color:#1E9FFF; font-weight:bold;">1分钟</span>,累计处理次数 <span style="color:#1E9FFF; font-weight:bold;">3次</span>
        å¤„理记录:该工单累计处理时长 <span style="color:#1E9FFF; font-weight:bold;">1分钟</span>,累计处理次数 <span
            style="color:#1E9FFF; font-weight:bold;">3次</span>
    </div>
    <div class="timeline-container">
        <!-- è¿™é‡Œæ˜¯å¯æ»šåŠ¨çš„æ—¶é—´è½´åŒºåŸŸ -->
        <div class="custom-timeline scrollable-area method-1 smooth-scroll" id="timelineScroll">
            <!-- å·²å®Œæˆ -->
            <!-- å·²å®Œæˆ
            <div class="timeline-item">
                <div class="timeline-icon status-completed">
                    <i class="layui-icon layui-icon-ok"></i>
@@ -208,8 +223,9 @@
                    <div class="time-info">2026-01-06 13:56:21</div>
                </div>
            </div>
            -->
            <!-- å¤„理中 -->
            <!-- å¤„理中
            <div class="timeline-item">
                <div class="timeline-icon status-processing">
                    <i class="layui-icon layui-icon-loading"></i>
@@ -221,8 +237,9 @@
                    <div class="time-info">2026-01-06 13:56:01</div>
                </div>
            </div>
            -->
            <!-- å¾…接收 -->
            <!-- å¾…接收
            <div class="timeline-item">
                <div class="timeline-icon status-waiting">
                    <i class="layui-icon layui-icon-user"></i>
@@ -233,8 +250,9 @@
                    <div class="time-info">2026-01-06 13:55:20</div>
                </div>
            </div>
            -->
            <!-- æ–°å»ºå·¥å• -->
            <!-- æ–°å»ºå·¥å•
            <div class="timeline-item">
                <div class="timeline-icon status-created">
                    <i class="layui-icon layui-icon-add-circle"></i>
@@ -245,61 +263,73 @@
                    <div class="time-info">2026-01-06 13:55:00</div>
                </div>
            </div>
            -->
            <!-- ä»¥ä¸‹ä¸ºé¢å¤–记录,用于演示滚动效果 -->
            <div class="extra-records">
                <!-- é¢å¤–记录1 -->
                <div class="timeline-item">
                    <div class="timeline-icon status-waiting">
                        <i class="layui-icon layui-icon-user"></i>
                    </div>
                    <div class="timeline-content">
                        <div class="operator-info">系统自动</div>
                        <div class="status-change">工单已创建,等待分配</div>
                        <div class="time-info">2026-01-06 13:54:30</div>
                    </div>
                </div>
                <!-- é¢å¤–记录2 -->
                <div class="timeline-item">
                    <div class="timeline-icon status-waiting">
                        <i class="layui-icon layui-icon-notice"></i>
                    </div>
                    <div class="timeline-content">
                        <div class="operator-info">系统自动</div>
                        <div class="status-change">发送工单创建通知</div>
                        <div class="time-info">2026-01-06 13:54:15</div>
                    </div>
                </div>
<!-- å…¨å±€js -->
<script th:src="@{/js/jquery.min.js}"></script>
                <!-- é¢å¤–记录3 -->
                <div class="timeline-item">
                    <div class="timeline-icon status-completed">
                        <i class="layui-icon layui-icon-ok"></i>
                    </div>
                    <div class="timeline-content">
                        <div class="operator-info">用户提交</div>
                        <div class="status-change">工单提交成功</div>
                        <div class="status-description">用户通过Web端提交工单</div>
                        <div class="time-info">2026-01-06 13:54:00</div>
                    </div>
                </div>
<script th:inline="javascript">
    var list = [[${list}]];
                <!-- é¢å¤–记录4 -->
                <div class="timeline-item">
                    <div class="timeline-icon status-created">
                        <i class="layui-icon layui-icon-edit"></i>
                    </div>
                    <div class="timeline-content">
                        <div class="operator-info">用户 å¼ ä¸‰</div>
                        <div class="status-change">填写工单信息</div>
                        <div class="status-description">问题描述:公众号无法正常登录</div>
                        <div class="time-info">2026-01-06 13:53:45</div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
    $(function () {
        if (list && list.length > 0) {
            init();
        }
        function getNodeName(node) {
            if (node.indexOf('start') > 0) {
                return '提交';
            } else if (node.indexOf('end') > 0) {
                return '完成';
            } else if ('node1' === node) {
                return '库区审批';
            } else if ('node2' === node) {
                return '监管审批';
            } else if ('node3' === node) {
                return '银行审批';
            } else {
                return '审批';
            }
        }
        function init() {
            var htm = '';
            for (var i = 0; i < list.length; i++) {
                var item = list[i];
                var node = item.node;
                htm += '<div class="timeline-item">';
                if (node.indexOf('start') > 0) {
                    htm += '<div class="timeline-icon status-created">';
                    htm += '<i class="layui-icon layui-icon-add-circle"></i>'
                } else if (node.indexOf('end') > 0) {
                    htm += '<div class="timeline-icon status-completed">';
                    htm += '<i class="layui-icon layui-icon-ok"></i>'
                } else {
                    htm += '<div class="timeline-icon status-processing">';
                    htm += '<i class="layui-icon layui-icon-loading"></i>'
                }
                htm += '</div>';
                htm += '<div class="timeline-content">';
                //htm += '<div class="operator-info">' + item.assigneeName + '</div>';
                htm += '<div class="operator-info">';
                htm += '流程节点:'+getNodeName(node);
                htm += ' å®¡æ‰¹åŠ¨ä½œï¼š'+item.action;
                htm += ' ç»åŠžäººï¼š'+item.assigneeName;
                htm += '</div>';
                htm += '<div class="status-change">' + item.remark + '</div>';
                htm += '<div class="time-info">' + item.createTime + '</div>';
                htm += '</div></div>';
            }
            $('#timelineScroll').html(htm);
        }
    });
</script>
</body>
</html>