processSetItem.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <template>
  2. <div>
  3. <div class="process-set-item" v-for="(item,index) in list" :key="item.id">
  4. <div :class="'process-set-state ' + returnItemClass(item)">
  5. <div class="process-set-state-2">
  6. <div class="process-set-state-1"></div>
  7. </div>
  8. </div>
  9. <div :class="'line line-top ' + returnItemClass(item)" v-if="index > 0"></div>
  10. <div :class="'line line-bottom ' + returnItemClass(item)" v-if="index < list.length-1 || type === 'edit'">
  11. </div>
  12. <div class="process-item-title">
  13. <span class="label">{{index+1}}.{{item.name}}</span>
  14. <i class="el-icon-edit-outline color-primary" v-if="type === 'edit'"
  15. @click="edit('update', item.id)"></i>
  16. <i class="el-icon-delete color-danger" v-if="type === 'edit'" @click="edit('delete', item.id)"></i>
  17. </div>
  18. <!-- 可附件 -->
  19. <div v-if="item.type === 1">
  20. <div v-if="(item.status === 1 || item.status === 4) && item.roleId === roleType">
  21. <upload ref="upload" :list="!item.attachmentContent?[]:JSON.parse(item.attachmentContent)"
  22. type="edit" text="上传文件" accept="*">
  23. </upload>
  24. <div class="operation-button">
  25. <el-button size="mini" @click="submit(item)">保存草稿</el-button>
  26. <el-button size="mini" type="primary" @click="submit(item, 2)">提交</el-button>
  27. </div>
  28. </div>
  29. <div v-else-if="item.status === 2 && roleType === 2">
  30. <upload :list="!item.attachmentContent ? [] : JSON.parse(item.attachmentContent)">
  31. </upload>
  32. <div class="operation-button">
  33. <el-button size="mini" type="primary" @click="updateStatus(item,3)">通过</el-button>
  34. <el-button size="mini" type="danger" @click="updateStatus(item,4)">不通过</el-button>
  35. </div>
  36. </div>
  37. <!-- 展示 -->
  38. <div v-else-if="item.status !== 1 && item.attachmentContent">
  39. <upload :list="!item.attachmentContent ? [] : JSON.parse(item.attachmentContent)">
  40. </upload>
  41. </div>
  42. </div>
  43. <!-- 可付款 -->
  44. <div v-else-if="item.type === 2">
  45. <div v-if="(item.status === 1 || item.status === 4) && item.roleId === roleType">
  46. <div>
  47. <span>待付款</span>
  48. <span class="color-danger">¥</span>
  49. <span class="color-danger">{{item.totalFee}}</span>
  50. </div>
  51. <div class="operation-button">
  52. <el-button size="mini" type="primary" @click="payment(item)">确认付款</el-button>
  53. </div>
  54. </div>
  55. <!-- 展示 -->
  56. <div v-else-if="item.type === 2 && item.status === 3">
  57. <div class="hui-state">
  58. <div class="hui-state-bage hui-state-success"></div>
  59. <div class="hui-state-label">
  60. <span>已支付</span>
  61. <span class="color-success">¥</span>
  62. <span class="color-success">{{item.totalFee}}</span>
  63. </div>
  64. </div>
  65. </div>
  66. </div>
  67. <!-- 不可添加附件 -->
  68. <div v-else-if="item.children.length === 0">
  69. <div class="operation-buttons" v-if="(item.status === 1 || item.status === 4) && roleType === 2">
  70. <el-button size="mini" type="primary" @click="updateStatus(item,3)">通过</el-button>
  71. <el-button size="mini" type="danger" @click="updateStatus(item,4)">不通过</el-button>
  72. </div>
  73. </div>
  74. <div class="process-item-content" v-if="item.children">
  75. <process-set-item :list="item.children" :type="type" :parentId="item.id" :roleType="roleType">
  76. </process-set-item>
  77. </div>
  78. </div>
  79. <div class="process-set-insert" @click="edit('insert', parentId || -1)" v-if="type === 'edit'">新增</div>
  80. <el-dialog :close-on-click-modal="false" title="支付订单" :visible.sync="dialogVisible" width="600px"
  81. :append-to-body="true">
  82. <pay-order v-if="dialogVisible" :orderNo="order.orderNo" @callback="callback"></pay-order>
  83. </el-dialog>
  84. </div>
  85. </template>
  86. <script>
  87. const processSetItem = () => import('./processSetItem.vue');
  88. const upload = () => import('@/components/common/upload');
  89. const payOrder = () => import('@/components/website/payOrder');
  90. import {
  91. updateProcessData,
  92. updateProcessStatus
  93. } from '@/api/system'
  94. import {
  95. createProcessOrder,
  96. getOrderListByQuery
  97. } from '@/api/serve'
  98. export default {
  99. props: ['list', 'type', 'parentId', 'roleType'],
  100. data() {
  101. return {
  102. dialogVisible: false,
  103. order: {},
  104. timeOut: null,
  105. nowItem: {}
  106. }
  107. },
  108. beforeDestroy() {
  109. if (!this.timeOut) return;
  110. clearTimeout(this.timeOut);
  111. this.timeOut = null
  112. },
  113. mounted() {},
  114. methods: {
  115. payment(item) {
  116. this.nowItem = item;
  117. this.$loading();
  118. getOrderListByQuery({
  119. proceId: item.id
  120. }).then(res => {
  121. if (res.state) {
  122. if (res.data.length === 0) {
  123. createProcessOrder(item.id, this.$store.getters.organization.id).then(res => {
  124. if (res.state) {
  125. this.order = res.data;
  126. this.$loading.close();
  127. this.dialogVisible = true;
  128. } else {
  129. this.$loading.close();
  130. }
  131. })
  132. } else {
  133. this.order = res.data[0];
  134. this.$loading.close();
  135. this.dialogVisible = true;
  136. }
  137. } else {
  138. this.$loading.close();
  139. }
  140. })
  141. },
  142. returnItemClass(item) {
  143. let str = '';
  144. switch (item.status) {
  145. case 1:
  146. case 2:
  147. str = 'waiting'
  148. break;
  149. case 3:
  150. str = 'success'
  151. break;
  152. case 4:
  153. str = 'error'
  154. break;
  155. default:
  156. str = 'info'
  157. break;
  158. }
  159. return str;
  160. },
  161. edit(type, id) {
  162. this.$store.dispatch('app/changeProcessSet', {
  163. type,
  164. id
  165. });
  166. },
  167. submit(item, status) {
  168. if (!this.$refs.upload) return;
  169. if (this.$refs.upload[0].fileList.length === 0) return this.$message.warning('至少上传一个文件');
  170. let data = {
  171. id: item.id,
  172. sequence: item.sequence
  173. };
  174. data['attachmentContent'] = JSON.stringify(this.$refs.upload[0].fileList);
  175. updateProcessData(data).then(res => {
  176. if (res.state) {
  177. if (status) {
  178. this.updateStatus(item, status);
  179. } else {
  180. this.$message.success('操作成功');
  181. }
  182. }
  183. })
  184. },
  185. updateStatus(item, status) {
  186. updateProcessStatus(status, item.id).then(res => {
  187. if (res.state) {
  188. this.$message.success('操作成功');
  189. this.edit('reload', status === 3 ? item.id : 0);
  190. }
  191. })
  192. },
  193. callback(type,operationType) {
  194. this.visible = false;
  195. if (type === 'payState') {
  196. this.timeOut = setTimeout(() => {
  197. if(this.operationType === 'success') this.updateStatus(this.nowItem, 3);
  198. clearTimeout(this.timeOut);
  199. this.timeOut = null;
  200. }, 1000)
  201. }
  202. }
  203. },
  204. components: {
  205. processSetItem,
  206. upload,
  207. payOrder
  208. }
  209. }
  210. </script>
  211. <style>
  212. </style>