| | |
| | | > |
| | | <div class="content" style="display: flex"> |
| | | <div class="processBox" v-if="dialogMode !== 'add' && processList.length"> |
| | | <el-timeline class="gd-timeline"> |
| | | <el-timeline-item |
| | | v-for="(activity, index) in processList" |
| | | :key="index" |
| | | :icon="Check" |
| | | :type="index === processList.length - 1 ? 'success' : 'info'" |
| | | :color="activity.color" |
| | | :hollow="activity.hollow" |
| | | :timestamp="activity.createTime" |
| | | > |
| | | <div class="item-content"> |
| | | <div>{{ activity.operator }}</div> |
| | | <div class="flowName">{{ activity.flowName }}</div> |
| | | <div class="timeline-wrapper"> |
| | | <div v-for="(stage, stageIndex) in processList" :key="stageIndex" class="stage-group"> |
| | | <!-- 大节点 Stage Node --> |
| | | <div class="stage-node"> |
| | | <div class="stage-icon" :class="{ reached: stage.reached }"> |
| | | <el-icon v-if="stage.reached"><Check /></el-icon> |
| | | <span v-else class="stage-index">{{ stageIndex + 1 }}</span> |
| | | </div> |
| | | <span class="stage-name">{{ stage.stageName }}</span> |
| | | </div> |
| | | </el-timeline-item> |
| | | </el-timeline> |
| | | |
| | | <!-- 小节点 Child Nodes --> |
| | | <div class="child-list" v-if="stage.child && stage.child.length"> |
| | | <template v-for="(child, childIndex) in stage.child.filter(c => c.reached)"> |
| | | <div v-if="child.reached" :key="childIndex" class="child-node"> |
| | | <div class="child-left"> |
| | | <span class="child-status">{{ child.statusName }}</span> |
| | | </div> |
| | | <div class="child-dot"></div> |
| | | <div class="child-right"> |
| | | <span class="child-operator">{{ child.operator || '-' }}</span> |
| | | <span class="child-time">{{ child.createTime || '-' }}</span> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | </div> |
| | | |
| | | <!-- 连接线 --> |
| | | <div |
| | | class="connector-line" |
| | | v-if="stageIndex < processList.length - 1" |
| | | :class="{ reached: stage.reached }" |
| | | ></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="leftBox"> |
| | | <div v-if="dialogReadonly"> |
| | |
| | | const gdStatusObj = { |
| | | '10': { reason: '拒单原因', operationType: '2', title: '拒绝接单' }, |
| | | '11': { reason: '拒单原因' }, |
| | | '20': { reason: '原因', operationType: '3',title:'申请取消' }, |
| | | '20': { reason: '原因', operationType: '3', title: '申请取消' }, |
| | | '21': { reason: '取消原因' }, |
| | | '23': { reason: '取消原因' }, |
| | | '30': { reason: '修改原因', operationType: '9',title:'协商修改' }, |
| | | '30': { reason: '修改原因', operationType: '9', title: '协商修改' }, |
| | | '31': { reason: '修改原因' }, |
| | | '40': { reason: '' }, |
| | | '50': { reason: '情况说明', operationType: '11',title:'结算' }, |
| | | '50': { reason: '情况说明', operationType: '11', title: '结算' }, |
| | | '60': { reason: '情况说明' }, |
| | | } |
| | | |
| | |
| | | row: formData.value, |
| | | type: gdStatusObj[gdStatus.value].operationType, |
| | | formLabel: gdStatusObj[gdStatus.value].reason, |
| | | title: gdStatusObj[gdStatus.value]?.title || '新增' |
| | | title: gdStatusObj[gdStatus.value]?.title || '新增', |
| | | }) |
| | | }) |
| | | } |
| | |
| | | } |
| | | |
| | | .processBox { |
| | | padding: 24px 0; |
| | | padding: 24px 16px; |
| | | width: 312px; |
| | | border: 1px solid #e4e4e4; |
| | | border-radius: 8px; |
| | | overflow: auto; |
| | | background: #fff; |
| | | |
| | | .item-content { |
| | | .timeline-wrapper { |
| | | padding-left: 100px; |
| | | position: relative; |
| | | .flowName { |
| | | width: 80px; |
| | | } |
| | | |
| | | .stage-group { |
| | | position: relative; |
| | | } |
| | | |
| | | // 大节点 - Stage Node |
| | | .stage-node { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 12px; |
| | | margin-bottom: 8px; |
| | | |
| | | .stage-icon { |
| | | width: 28px; |
| | | height: 28px; |
| | | border-radius: 50%; |
| | | background: #e0e0e0; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | color: #fff; |
| | | font-size: 14px; |
| | | font-weight: 600; |
| | | flex-shrink: 0; |
| | | position: relative; |
| | | z-index: 2; |
| | | |
| | | &.reached { |
| | | background: #1a1a2e; |
| | | } |
| | | |
| | | .el-icon { |
| | | font-size: 16px; |
| | | } |
| | | |
| | | .stage-index { |
| | | font-size: 12px; |
| | | } |
| | | } |
| | | |
| | | .stage-name { |
| | | width: 70px; |
| | | text-align: right; |
| | | position: absolute; |
| | | left: -120px; |
| | | top: 0px; |
| | | left: -80px; |
| | | font-family: Roboto, Roboto; |
| | | font-weight: bold; |
| | | font-size: 16px; |
| | | color: rgba(0,0,0,0.85); |
| | | } |
| | | } |
| | | |
| | | // 小节点 - Child Nodes |
| | | .child-list { |
| | | position: relative; |
| | | left: -52px; |
| | | } |
| | | |
| | | .child-node { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | position: relative; |
| | | |
| | | |
| | | &:last-child::before { |
| | | bottom: 50%; |
| | | } |
| | | |
| | | .child-left { |
| | | width: 100px; |
| | | flex-shrink: 0; |
| | | text-align: right; |
| | | padding-right: 20px; |
| | | font-family: Source Han Sans CN, Source Han Sans CN; |
| | | font-weight: 400; |
| | | font-size: 14px; |
| | | color: rgba(0,0,0,0.85); |
| | | |
| | | .child-status { |
| | | white-space: nowrap; |
| | | } |
| | | } |
| | | |
| | | .child-dot { |
| | | width: 12px; |
| | | height: 12px; |
| | | border-radius: 50%; |
| | | background: #1a1a2e; |
| | | flex-shrink: 0; |
| | | position: relative; |
| | | z-index: 2; |
| | | margin-top: 4px; |
| | | } |
| | | |
| | | .child-right { |
| | | flex: 1; |
| | | padding-left: 12px; |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 2px; |
| | | |
| | | .child-operator { |
| | | font-family: Source Han Sans CN, Source Han Sans CN; |
| | | font-weight: 400; |
| | | font-size: 14px; |
| | | color: rgba(0,0,0,0.85); |
| | | |
| | | } |
| | | |
| | | .child-time { |
| | | white-space: nowrap; |
| | | font-family: Source Han Sans CN, Source Han Sans CN; |
| | | font-weight: 400; |
| | | font-size: 14px; |
| | | color: rgba(0,0,0,0.45); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 连接线 |
| | | .connector-line { |
| | | position: absolute; |
| | | left: 13px; |
| | | width: 2px; |
| | | height: 100%; |
| | | background: #e0e0e0; |
| | | top: 28px; |
| | | z-index: 1; |
| | | |
| | | &.reached { |
| | | background: #1a1a2e; |
| | | } |
| | | } |
| | | } |