index.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <template>
  2. <div class="p-3">
  3. <div class="bg-fff flex1 ov-hd d-flex flex-cln">
  4. <div class="d-flex a-c pd-16 border-bottom">
  5. <div class="f-s-20 c-333 f-w-7 mr-10">
  6. <template v-if="form?.status === '0'">申报详情审核</template>
  7. <template v-if="['1', '2'].includes(form?.status)">申报详情</template>
  8. </div>
  9. <el-button @click="router.go(-1)" type="primary" text>
  10. <el-icon>
  11. <Back />
  12. </el-icon>
  13. 返回上一级
  14. </el-button>
  15. </div>
  16. <div class="flex1 over-auto">
  17. <div v-if="form" class="pd-16" style="overflow: hidden;">
  18. <div class="info-title f-w-5 mb-10">申报信息</div>
  19. <el-descriptions :column="2">
  20. <el-descriptions-item label="企业名称:">{{ form?.cpyname || '-' }}</el-descriptions-item>
  21. <el-descriptions-item label="标准名称:">{{ form?.standardName || '-' }}</el-descriptions-item>
  22. <el-descriptions-item label="备注:">{{ form?.remark || '-' }}</el-descriptions-item>
  23. <el-descriptions-item label="申报人:">{{ form?.createByName || '-' }}</el-descriptions-item>
  24. <el-descriptions-item label="申报时间:">{{ form?.createTime || '-' }}</el-descriptions-item>
  25. </el-descriptions>
  26. <el-divider />
  27. <div class="info-title f-w-5 mb-10">已在“企业标准信息公共服务平台”上传的企业标准文本</div>
  28. <FileLook v-model="form.accessory" isObject :span="12"></FileLook>
  29. <el-divider />
  30. <div class="info-title f-w-5 mb-10">生产许可证</div>
  31. <div class="imgout">
  32. <div v-for="(item, index) in form?.imgs" :key="index">
  33. <el-image :src="item" style="height: 200px;width: 200px;" fit="cover"
  34. :preview-src-list="form?.imgs" :initial-index="index" />
  35. </div>
  36. </div>
  37. <el-divider />
  38. <div class="info-title f-w-5 mb-10">生产工艺流程图</div>
  39. <FileLook v-model="form.flowAccessory" isObject :span="12"></FileLook>
  40. <el-divider />
  41. <div class="info-title f-w-5 mb-10">检验报告</div>
  42. <FileLook v-model="form.latestCheckAccessory" isObject :span="12"></FileLook>
  43. <el-divider />
  44. <!-- <div class="info-title f-w-5 mb-10">最近生产三批次生产追溯记录</div>
  45. <FileLook v-model="form.latestTraceAccessory" isObject :span="6"></FileLook></div> -->
  46. <el-divider />
  47. <div class="info-title f-w-5 mb-10">自我承诺书,三年内没有不良记录</div>
  48. <FileLook v-model="form.otherAccessory" isObject :span="12"></FileLook>
  49. <el-divider />
  50. <div class="info-title f-w-5 mb-10">产品图</div>
  51. <div class="imgout">
  52. <div v-for="(item, index) in form?.productImags" :key="index">
  53. <el-image :src="item" style="height: 200px;width: 200px;" fit="cover"
  54. :preview-src-list="form?.imgs" :initial-index="index" />
  55. </div>
  56. </div>
  57. <el-divider />
  58. <template v-if="form?.approvalLogVos">
  59. <div class="info-title f-w-5 mb-10">审核记录</div>
  60. <!-- // 表格 -->
  61. <vxe-table :data="form?.approvalLogVos" border min-height="0" style="width: 100%">
  62. <vxe-column title="审核结果">
  63. <template #default="{ row }">
  64. <div v-if="+row?.res === 1" class="c-primary">通过</div>
  65. <div v-if="+row?.res === 2" class="c-danger">不通过</div>
  66. <div v-if="+row?.res === 2" class="f-s-12 c-danger">原因:{{ row?.msg }}</div>
  67. </template>
  68. </vxe-column>
  69. <vxe-column field="createTime" title="审核时间" />
  70. <vxe-column field="auditorName" title="审核人" />
  71. </vxe-table>
  72. </template>
  73. </div>
  74. </div>
  75. <div v-if="!+form?.status" class="d-flex a-c j-c pd-16">
  76. <el-button @click="router.go(-1)">取消</el-button>
  77. <el-button type="danger" @click="noPass">不通过</el-button>
  78. <el-button type="primary" @click="showCheckPass = true">通过</el-button>
  79. </div>
  80. </div>
  81. </div>
  82. <ChooseDeclarationDecord v-if="showCheckPass" v-model:show="showCheckPass" :info="form" :dict="dict"
  83. @success="successChange"></ChooseDeclarationDecord>
  84. </template>
  85. <script setup name="declaration-detail" lang="ts">
  86. import { ref, reactive, onMounted } from 'vue';
  87. import { debounce } from 'lodash';
  88. import { useRouter } from 'vue-router';
  89. import { expertChooseApprove, expertChooseDetail, expertChooseRelationList } from '@/api/authority';
  90. import { DeclarationDetail, DeclaraapprovalStandard } from '@/api/leader'
  91. import ChooseDeclarationDecord from "../models/ChooseDeclarationDecord.vue";
  92. import { FileLook } from '@/views/models';
  93. import { colNoData } from '@/utils/noData';
  94. import { VxeTablePropTypes } from 'vxe-table';
  95. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  96. const dict = proxy?.useDict('dm_person_type', 'dm_join_type', 'yes_no', 'sys_sex_type', 'dm_position_status');
  97. const { dm_person_type, dm_join_type, yes_no, sys_sex_type } = toRefs<any>(dict);
  98. const router = useRouter();
  99. const route = useRoute();
  100. const form = ref<any>(null);
  101. const showCheckPass = ref(false);
  102. // 获取申报详情
  103. const getDeclarationDetail = async () => {
  104. const res = await DeclarationDetail(route.query.id);
  105. if (!res || res.code !== 200) return;
  106. form.value = res.data;
  107. }
  108. // 获取专家详情
  109. const getExpertDetail = async () => {
  110. if (route.query?.id) {
  111. const res = await expertChooseDetail(route.query.id);
  112. if (!res || res.code !== 200) return;
  113. form.value = res.data;
  114. }
  115. };
  116. const noPass = async () => {
  117. ElMessageBox.prompt('是否确认将该事项的专家抽取审核为不通过!请填写不通过原因:', '审核不通过', {
  118. confirmButtonText: '确认不通过',
  119. cancelButtonText: '取消',
  120. // 校验必填
  121. inputValidator: (value) => {
  122. if (!value) {
  123. return '请填写不通过原因';
  124. }
  125. return true;
  126. },
  127. inputPlaceholder: '请填写不通过原因'
  128. })
  129. .then(({ value }) => {
  130. const params = {
  131. targetId: route.query.id,
  132. res: '2', // 不通过
  133. msg: value
  134. };
  135. submitApprove(params);
  136. })
  137. .catch(() => {
  138. ElMessage({
  139. type: 'info',
  140. message: '取消审核'
  141. });
  142. });
  143. };
  144. // 提交审核
  145. const submitApprove = async (params: any) => {
  146. proxy.$modal.loading('正在提交审核,请稍候...');
  147. const res = await DeclaraapprovalStandard(params).finally(() => {
  148. proxy.$modal.closeLoading();
  149. });
  150. if (res.code === 200) {
  151. ElMessage({
  152. type: 'success',
  153. message: '操作成功'
  154. });
  155. router.go(-1);
  156. } else {
  157. ElMessage({
  158. type: 'error',
  159. message: res.msg || '操作失败'
  160. });
  161. }
  162. };
  163. const successChange = (val: any) => {
  164. console.log('成功');
  165. showCheckPass.value = false;
  166. const params = {
  167. targetId: route.query.id,
  168. res: '1', // 通过
  169. // personInfo: val
  170. };
  171. submitApprove(params);
  172. };
  173. const list = ref<any[]>([]);
  174. // 通用行合并函数(将相同多列数据合并为一行)
  175. const rowspanMethod: any = ({ row, _rowIndex, column, visibleData }) => {
  176. const fields = ['personType', 'personCount', 'id'];
  177. const cellValue = row[column.field];
  178. if (cellValue && fields.includes(column.field)) {
  179. const prevRow = visibleData[_rowIndex - 1];
  180. let nextRow = visibleData[_rowIndex + 1];
  181. if (prevRow && prevRow[column.field] === cellValue) {
  182. return { rowspan: 0, colspan: 0 };
  183. } else {
  184. let countRowspan = 1;
  185. while (nextRow && nextRow[column.field] === cellValue) {
  186. nextRow = visibleData[++countRowspan + _rowIndex];
  187. }
  188. if (countRowspan > 1) {
  189. return { rowspan: countRowspan, colspan: 1 };
  190. }
  191. }
  192. }
  193. };
  194. onMounted(() => {
  195. getDeclarationDetail()
  196. });
  197. </script>
  198. <style scoped>
  199. .imgout {
  200. display: flex;
  201. flex-wrap: wrap;
  202. row-gap: 20px;
  203. column-gap: 30px;
  204. }
  205. :deep(body) {
  206. overflow: hidden;
  207. }
  208. </style>