index.vue 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <script setup lang="ts">
  2. import { ref , reactive} from 'vue'
  3. import { ElMessage, type FormInstance, type FormProps, type FormRules, type UploadRawFile } from 'element-plus'
  4. import { delImgById, getCompanyDetailByUnicode, saveSelfReport } from '@/views/creditServices/type'
  5. import SmallSearch from '@/components/SmallSearch.vue'
  6. import NewDynamics from '@/components/NewDynamics.vue'
  7. import { downloadFile } from '@/utils/request'
  8. import { useRouter } from 'vue-router'
  9. const router = useRouter()
  10. const labelPosition = ref<FormProps['labelPosition']>('left')
  11. const selfReportRef = ref<FormInstance>();
  12. const uploadFilesList = ref<any>([]);
  13. const selfReportForm = ref({
  14. contactInformation: '',
  15. contacts: '',
  16. enterpriseName: '',
  17. unifiedSocialCreditCode:'',
  18. complainantIdNumber:'',
  19. files:uploadFilesList.value
  20. })
  21. const rules = reactive<FormRules<typeof selfReportForm.value>>({
  22. contactInformation: [
  23. { required: true, message: '请输入联系电话', trigger: 'blur' },
  24. { min: 11, max: 11, message: '请输入正确的联系电话', trigger: 'blur' }
  25. ],
  26. contacts: [
  27. { required: true, message: '请输入联系人', trigger: 'blur' },
  28. { min: 2, max: 10, message: '请输入正确的联系人', trigger: 'blur' }
  29. ],
  30. enterpriseName: [
  31. { required: true, message: '请输入企业名称', trigger: 'blur' }
  32. ],
  33. complainantIdNumber:[
  34. { required: true,validator:(rule: any, value: any, callback: any)=>{
  35. if (value == '') {
  36. callback(new Error('请输入身份证'))
  37. }
  38. if (!/^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])\d{3}(\d|X|x)$/.test(value)) {
  39. callback(new Error('请输入正确的身份证'))
  40. }
  41. callback()
  42. }, trigger: 'blur' }
  43. ],
  44. unifiedSocialCreditCode: [
  45. { required: true,validator:(rule: any, value: any, callback: any)=>{
  46. if (value == '') {
  47. callback(new Error('请输入统一社会信用代码'))
  48. }
  49. if (!/^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/.test(value)) {
  50. callback(new Error('请输入正确的统一社会信用代码'))
  51. }
  52. callback()
  53. }, trigger: 'blur' }
  54. ]
  55. })
  56. const submitReportForm = ()=>{
  57. selfReportRef.value?.validate( async (valid) => {
  58. if (valid) {
  59. const res = await saveSelfReport(selfReportForm.value);
  60. if(res.code == 200){
  61. ElMessage.success(res.msg+"即将返回首页");
  62. setTimeout(()=>{
  63. router.push('/home')
  64. },2000)
  65. canSelfReport.value = false;
  66. reset()
  67. }
  68. }
  69. })
  70. }
  71. const reset = ()=>{
  72. selfReportRef.value?.resetFields();
  73. uploadFilesList.value = [];
  74. fileList.value = [];
  75. canSelfReport.value = true;
  76. }
  77. const upload = reactive({
  78. // 是否显示弹出层(用户导入)
  79. open: false,
  80. // 弹出层标题(用户导入)
  81. title: '',
  82. // 是否禁用上传
  83. isUploading: false,
  84. // 上传的地址
  85. url: import.meta.env.VITE_APP_BASE_URL + '/commonFile/uploadFile',
  86. })
  87. const handleRemove = async (uploadFile:any) => {
  88. const res = await delImgById(uploadFile.response.data.id);
  89. if(res.code == 200){
  90. ElMessage.success('删除成功');
  91. uploadFilesList.value = uploadFilesList.value.filter((item:any) => item.id != uploadFile.response.data.id);
  92. }
  93. }
  94. const handleFileSuccess = (q:any)=>{
  95. isloading.value = false;
  96. if(q.code == 500){
  97. ElMessage.error('文件大于了30M')
  98. return;
  99. }
  100. ElMessage.success('上传成功');
  101. uploadFilesList.value.push(q.data);
  102. }
  103. const fileList = ref([]);
  104. const canSelfReport = ref<boolean>(true);
  105. const BASE_URL = import.meta.env.VITE_APP_BASE_URL;
  106. const isloading = ref<boolean>(false)
  107. const beforeUpload = (q:UploadRawFile)=>{
  108. if(q.size > 1024*1024*30){
  109. ElMessage.error('文件大于了30M')
  110. return false;
  111. };
  112. isloading.value = true
  113. }
  114. const checkInformation = async (unicode:string)=>{
  115. const res = await getCompanyDetailByUnicode(unicode);
  116. if(res.code == 200){
  117. res.data.forEach((q:any)=>{
  118. q.createTime = q.createTime.split('T')[0];
  119. q.files = q.files.map((w:FileType)=>w.fileOriginalName+"<br>").join("<br>");
  120. if(!q.files){
  121. q.files = '没有上传文件';
  122. }
  123. })
  124. companyUploadInformationList.value = res.data;
  125. dialogVisible.value = true;
  126. }
  127. }
  128. const dialogVisible = ref(false);
  129. const companyUploadInformationList = ref<any>([]);
  130. </script>
  131. <template>
  132. <div class="serviceContainer" v-loading="isloading">
  133. <div class="w-912px ml-auto mr-auto pt-20px mb-20px text-14px">
  134. 你所在的位置:<span class="cursor-pointer">首页</span> > <span class="color-#006eff">企业自主上报</span>
  135. </div>
  136. <div class="flex justify-between w-912px mr-a ml-a">
  137. <div class="w-603px pl-24px pr-24px pt-30px text-black bg-white">
  138. <div>
  139. <el-button class="float-right" @click="downloadFile(BASE_URL+'/owSelfReporting/downloadTemplateWord','企业自主上报模版.xlsx')" type="success">下载上报模版</el-button>
  140. <div>企业自主上报信息</div>
  141. <div>
  142. <!-- <el-radio-group v-model="labelPosition" aria-label="label position">-->
  143. <!-- <el-radio-button value="left">Left</el-radio-button>-->
  144. <!-- <el-radio-button value="right">Right</el-radio-button>-->
  145. <!-- <el-radio-button value="top">Top</el-radio-button>-->
  146. <!-- </el-radio-group>-->
  147. <div style="margin: 20px" />
  148. <el-form
  149. :label-position="labelPosition"
  150. label-width="auto"
  151. :model="selfReportForm"
  152. ref="selfReportRef"
  153. style="max-width: 600px"
  154. :rules="rules"
  155. >
  156. <el-form-item label="联系人" prop="contacts">
  157. <el-input v-model="selfReportForm.contacts" />
  158. </el-form-item>
  159. <el-form-item label="联系方式" prop="contactInformation">
  160. <el-input v-model="selfReportForm.contactInformation" />
  161. </el-form-item>
  162. <el-form-item label="身份证号" prop="complainantIdNumber">
  163. <el-input v-model="selfReportForm.complainantIdNumber" />
  164. </el-form-item>
  165. <el-form-item label="企业名称" prop="enterpriseName">
  166. <el-input v-model="selfReportForm.enterpriseName" />
  167. </el-form-item>
  168. <el-form-item label="统一社会信用代码" prop="unifiedSocialCreditCode">
  169. <el-input v-model="selfReportForm.unifiedSocialCreditCode" style="width: 290px;" />
  170. <el-button :disabled="!/^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/.test(selfReportForm.unifiedSocialCreditCode)" type="primary" style="margin-left: 10px" @click="checkInformation(selfReportForm.unifiedSocialCreditCode)">查询上报信息</el-button>
  171. </el-form-item>
  172. <el-upload
  173. ref="uploadRef"
  174. v-model:file-list="fileList"
  175. :action="upload.url"
  176. :on-remove="handleRemove"
  177. :multiple="true"
  178. accept=".doc, .docx, .png, .jpg, .pdf, .xls, .xlsx "
  179. :on-success="handleFileSuccess"
  180. :data="{moduleName:'上报模块'}"
  181. :before-upload="beforeUpload"
  182. >
  183. <el-button type="primary">上传附件</el-button>
  184. <template #tip>
  185. <div class="el-upload__tip">
  186. <span style="color: #fd2626">请同时上传信息盖章扫描件和EXCLE电子档</span>
  187. <br>
  188. <br>
  189. 只能上传doc docx png jpg pdf xls xlsx文件
  190. <br>
  191. <br>
  192. 且大小控制在30M内
  193. </div>
  194. </template>
  195. </el-upload>
  196. <el-button @click="submitReportForm" type="primary" :disabled="!canSelfReport">上报</el-button>
  197. <el-button @click="reset">重置</el-button>
  198. </el-form>
  199. </div>
  200. </div>
  201. </div>
  202. <div class="w-294px">
  203. <SmallSearch />
  204. <NewDynamics />
  205. </div>
  206. </div>
  207. <el-dialog v-model="dialogVisible" title="企业上报情况" width="500" draggable>
  208. <el-table :data="companyUploadInformationList" max-height="300">
  209. <el-table-column prop="contacts" label="联系人" />
  210. <el-table-column prop="createTime" label="上报时间" width="150" />
  211. <el-table-column prop="files" label="上报文件名" width="200">
  212. <template #default="scope">
  213. <div v-html="scope.row.files"></div>
  214. </template>
  215. </el-table-column>
  216. </el-table>
  217. <template #footer>
  218. <div class="dialog-footer">
  219. <el-button type="primary" @click="dialogVisible = false">
  220. 了解
  221. </el-button>
  222. </div>
  223. </template>
  224. </el-dialog>
  225. </div>
  226. </template>
  227. <style scoped>
  228. .serviceContainer {
  229. background-color: #ecf0f9;
  230. }
  231. </style>