processSetItem.vue 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <template>
  2. <div class="set-item-box">
  3. <div class="process-set-item" v-for="(item,index) in list" :key="item.id">
  4. <!-- 状态 -->
  5. <div :class="'process-set-state ' + returnItemClass(item)">
  6. <div class="process-set-state-2">
  7. <div class="process-set-state-1"></div>
  8. </div>
  9. </div>
  10. <!-- line -->
  11. <div :class="'line line-top ' + returnItemClass(item)" v-if="index > 0"></div>
  12. <div :class="'line line-bottom ' + returnItemClass(item)" v-if="index < list.length-1 || type === 'edit'">
  13. </div>
  14. <!-- 标题 -->
  15. <div class="process-item-title">
  16. <span class="label">{{index+1}}.{{item.name}}</span>
  17. <i class="el-icon-edit-outline color-primary" v-if="type === 'edit'"
  18. @click="edit('update', item.id)"></i>
  19. <i class="el-icon-delete color-danger" v-if="type === 'edit'" @click="edit('delete', item.id)"></i>
  20. </div>
  21. <!-- 内容 -->
  22. <div class="process-item-content" v-if="item.children">
  23. <!-- 附件 -->
  24. <div v-if="item.type === 1">
  25. <div class="process-set-item" v-for="(node,index) in item.children" :key="node.id">
  26. <!-- 状态 -->
  27. <div :class="'process-set-state ' + returnItemClass(item,node)">
  28. <div class="process-set-state-2">
  29. <div class="process-set-state-1"></div>
  30. </div>
  31. </div>
  32. <!-- 标题 -->
  33. <div class="process-item-title">
  34. <span class="label">{{node.name}}</span>
  35. <i class="el-icon-edit-outline color-primary" v-if="type === 'edit'"
  36. @click="edit('update', node.id)">
  37. </i>
  38. <i class="el-icon-delete color-danger" v-if="type === 'edit'"
  39. @click="edit('delete', node.id)">
  40. </i>
  41. </div>
  42. <!-- 内容 -->
  43. <div class="process-item-content" v-if="node.children">
  44. <!-- 可附件 -->
  45. <div v-if="(item.status === 1 || item.status === 4) && item.roleId === roleType">
  46. <upload ref="upload" v-model="node.attachmentContent" type="edit" text="上传文件"
  47. accept="*">
  48. </upload>
  49. </div>
  50. <div v-else-if="item.status === 2 && roleType === 2">
  51. <upload v-model="node.attachmentContent"></upload>
  52. <div class="operation-button" v-if="node.status !== 3 && node.status !== 4">
  53. <div class="operation-button-item success" @click="updateStatus(node,3)">
  54. <i class="el-icon-check"></i>
  55. </div>
  56. <div class="operation-button-item warning" @click="updateStatus(node,4)">
  57. <i class="el-icon-close"></i>
  58. </div>
  59. </div>
  60. </div>
  61. <!-- 展示 -->
  62. <div v-else-if="item.status !== 1 && node.attachmentContent">
  63. <upload v-model="node.attachmentContent">
  64. </upload>
  65. </div>
  66. </div>
  67. </div>
  68. <div class="operation-button"
  69. v-if="(item.status === 1 || item.status === 4) && item.roleId === roleType">
  70. <el-button size="mini" @click="fileSubmit(item)">保存草稿</el-button>
  71. <el-button size="mini" type="primary" @click="fileSubmit(item, 2)">提交</el-button>
  72. </div>
  73. <div class="operation-button" v-else-if="item.status === 2 && roleType === 2">
  74. <el-button size="mini" type="primary" @click="updateStatus(item,3)">通过</el-button>
  75. </div>
  76. <!-- 新增 -->
  77. <div class="process-set-insert" @click="edit('insert', item.id)" v-if="type === 'edit'">
  78. 新增
  79. </div>
  80. </div>
  81. <!-- 可付款 -->
  82. <div v-else-if="item.type === 2">
  83. <div v-if="(item.status === 1 || item.status === 4) && item.roleId === roleType">
  84. <div>
  85. <span>待付款</span>
  86. <span class="color-danger">¥</span>
  87. <span class="color-danger">{{item.totalFee}}</span>
  88. </div>
  89. <div class="operation-button">
  90. <el-button size="mini" type="primary" @click="payment(item)">确认付款</el-button>
  91. </div>
  92. </div>
  93. <!-- 展示 -->
  94. <div v-else-if="item.type === 2 && item.status === 3">
  95. <div class="hui-state">
  96. <div class="hui-state-bage hui-state-success"></div>
  97. <div class="hui-state-label">
  98. <span>已支付</span>
  99. <span class="color-success">¥</span>
  100. <span class="color-success">{{item.totalFee}}</span>
  101. </div>
  102. </div>
  103. <div v-if="roleType === 1 && item.payStatus === '支付成功'">
  104. <span class="color-primary" v-if="!item.invoice" @click="applyInvoice(item)">
  105. 开具发票
  106. </span>
  107. <span class="color-warning" v-else-if="!item.invoice.state">发票开具中</span>
  108. <span class="color-success" style="cursor: pointer;" v-else @click="lookOrder(item)">
  109. 查看发票
  110. </span>
  111. </div>
  112. </div>
  113. </div>
  114. <!-- 不可添加附件 -->
  115. <div v-else-if="item.children.length === 0">
  116. <div class="operation-buttons" v-if="(item.status === 1 || item.status === 4) && roleType === 2">
  117. <el-button size="mini" type="primary" @click="updateStatus(item,3)">通过</el-button>
  118. </div>
  119. </div>
  120. <process-set-item v-else :list="item.children" :type="type" :parent="item" :roleType="roleType">
  121. </process-set-item>
  122. </div>
  123. </div>
  124. <!-- 新增 -->
  125. <div class="process-set-insert" @click="edit('insert', parent ? parent.id : -1, parent)"
  126. v-if="type === 'edit' && (parent ? (parent.type != 3 && parent.type != 2) : true)">
  127. 新增
  128. </div>
  129. <el-dialog :close-on-click-modal="false" title="支付订单" :visible.sync="dialogVisible" width="600px"
  130. :append-to-body="true">
  131. <pay-order v-if="dialogVisible" :orderNo="nowItem.proceOrderNo" @callback="callback"></pay-order>
  132. </el-dialog>
  133. <el-dialog :close-on-click-modal="false" :title="type === 1?'开具发票':'过程支付'" :visible.sync="visible" width="900px"
  134. :append-to-body="true">
  135. <edit v-if="visible && dialogType === 1" @callback="callback" :orderNo="nowItem.proceOrderNo"></edit>
  136. <create-order v-if="visible && dialogType === 2" :serveId="nowItem.id" @callback="callback">
  137. </create-order>
  138. </el-dialog>
  139. <el-drawer title="发票详情" :visible.sync="drawer" :size="400" :append-to-body="true">
  140. <invoice-detail v-if="drawer" :detailId="nowItem.invoice.id"></invoice-detail>
  141. </el-drawer>
  142. </div>
  143. </template>
  144. <script>
  145. const processSetItem = () => import('./processSetItem.vue');
  146. const upload = () => import('@/components/common/upload');
  147. const createOrder = () => import('./createOrder.vue');
  148. const edit = () => import('@/components/work/finace/invoice/apply/edit');
  149. const invoiceDetail = () => import('@/components/work/finace/invoice/apply/detail');
  150. const payOrder = () => import('@/components/website/payOrder');
  151. import {
  152. updateProcessData,
  153. updateProcessStatus
  154. } from '@/api/system'
  155. export default {
  156. props: ['list', 'type', 'parent', 'roleType'],
  157. data() {
  158. return {
  159. nowItem: {},
  160. visible: false,
  161. drawer: false,
  162. detailId: '',
  163. dialogType: 1,
  164. dialogVisible: false
  165. }
  166. },
  167. mounted() {},
  168. methods: {
  169. applyInvoice(item, type) {
  170. this.dialogType = type || 1;
  171. this.nowItem = item;
  172. this.visible = true;
  173. },
  174. lookOrder(item) {
  175. this.nowItem = item;
  176. this.drawer = true;
  177. },
  178. payment(item) {
  179. this.nowItem = item;
  180. if (!item.proceOrderNo || item.payStatus === '超时已关闭') return this.applyInvoice(item, 2);
  181. this.dialogVisible = true;
  182. },
  183. returnItemClass(item, node) {
  184. let str = '';
  185. let status = node ? (item.status > node.status ? item.status : node.status) : item.status;
  186. switch (status) {
  187. case 1:
  188. case 2:
  189. str = 'waiting'
  190. break;
  191. case 3:
  192. str = 'success'
  193. break;
  194. case 4:
  195. str = 'error'
  196. break;
  197. default:
  198. str = 'info'
  199. break;
  200. }
  201. return str;
  202. },
  203. edit(type, id, parent) {
  204. this.$store.dispatch('app/changeProcessSet', {
  205. type,
  206. id,
  207. parent
  208. });
  209. },
  210. async fileSubmit(item, status) {
  211. if (status) updateProcessStatus(status, item.id);
  212. for (let i = 0; i < item.children.length; i++) {
  213. await this.submit(item.children[i])
  214. }
  215. this.$message.success('操作成功');
  216. },
  217. submit(item, status) {
  218. let data = {
  219. id: item.id,
  220. sequence: item.sequence,
  221. attachmentContent: item.attachmentContent
  222. };
  223. return updateProcessData(data);
  224. },
  225. updateStatus(item, status) {
  226. updateProcessStatus(status, item.id).then(res => {
  227. if (res.state) {
  228. this.$message.success('操作成功');
  229. this.edit('reload', status === 3 ? item.id : 0);
  230. }
  231. })
  232. },
  233. callback(type, operationType) {
  234. if (type === 'init' || type === 'cancel') this.visible = false;
  235. if (type === 'payState') {
  236. if (operationType === 'success') this.updateStatus(this.nowItem, 3);
  237. }
  238. if (type === 'init') this.edit('reload');
  239. if (type === 'reload') this.edit('reload');
  240. }
  241. },
  242. components: {
  243. processSetItem,
  244. upload,
  245. createOrder,
  246. edit,
  247. invoiceDetail,
  248. payOrder
  249. }
  250. }
  251. </script>
  252. <style>
  253. </style>