form.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. <template>
  2. <el-dialog title="社保申报信息" v-model="visible" :width="width" append-to-body draggable @close="close"
  3. :close-on-click-modal="false">
  4. <!-- <div slot="title" class="dialog-title-container">
  5. <span class="title-label"><i class="el-icon-document" /> 工资信息</span>
  6. <i class="el-icon-close" @click="close" />
  7. </div> -->
  8. <!-- 功能按钮 -->
  9. <div v-loading="loading">
  10. <div style="padding: 8px 24px 16px 24px">
  11. <el-form size="small" label-width="100px" v-model="form">
  12. <el-row :gutter="30">
  13. <el-col :span="12">
  14. <el-form-item label="客户名称">
  15. <div>{{ form.companyName }}</div>
  16. </el-form-item>
  17. </el-col>
  18. <el-col :span="12">
  19. <el-form-item label="所属月份">
  20. <!-- <div>{{ form.year }}-{{ form.month }}</div> -->
  21. <el-date-picker v-model="currentMonth" type="month" placeholder="请选择时间" format="YYYY-MM"
  22. @change="changeMonthHandle" />
  23. </el-form-item>
  24. </el-col>
  25. <el-col v-if="form.status === 4" :span="12">
  26. <el-form-item label="驳回原因">
  27. <div>{{ form.feedbackContent }}</div>
  28. </el-form-item>
  29. </el-col>
  30. <el-col :span="12">
  31. <el-form-item label="政务网账号" required class="edit-label">
  32. <template #label>
  33. <div>政务网账号</div>
  34. </template>
  35. <div>{{ form.governmentAccountNo }}</div>
  36. </el-form-item>
  37. </el-col>
  38. <el-col :span="12">
  39. <el-form-item label="政务网密码" required class="edit-label">
  40. <template #label>
  41. <div>政务网密码</div>
  42. </template>
  43. <div>{{ form.governmentPassword }}</div>
  44. </el-form-item>
  45. </el-col>
  46. <el-col :span="12">
  47. <el-form-item label="社保账号" required class="edit-label">
  48. <template #label>
  49. <div>社保账号</div>
  50. </template>
  51. <div>{{ form.socialSecurityAccountNo }}</div>
  52. </el-form-item>
  53. </el-col>
  54. <el-col :span="12">
  55. <el-form-item label="社保密码" required class="edit-label">
  56. <template #label>
  57. <div>社保密码</div>
  58. </template>
  59. <div>{{ form.socialSecurityPassword }}</div>
  60. </el-form-item>
  61. </el-col>
  62. <el-col :span="12">
  63. <el-form-item label="用工密码" required class="edit-label">
  64. <template #label>
  65. <div>用工密码</div>
  66. </template>
  67. <div>{{ form.employeePassword }}</div>
  68. </el-form-item>
  69. </el-col>
  70. <el-col :span="24">
  71. <el-divider />
  72. </el-col>
  73. <el-col :span="12">
  74. <el-form-item label="单位养老金:">
  75. <el-input-number v-if="form.status !==3" v-model="form.unitPension" size="small" placeholder="单位养老金"
  76. :precision="2" :controls="false" style="width: 100%" @change="amountChangeHandler" />
  77. <div v-else>{{ rowNum(form.unitPension) }}</div>
  78. </el-form-item>
  79. </el-col>
  80. <el-col :span="12">
  81. <el-form-item label="单位医疗险:">
  82. <el-input-number v-if="form.status !==3" v-model="form.unitMedical" size="small" placeholder="单位医疗险"
  83. :precision="2" :controls="false" style="width: 100%" @change="amountChangeHandler" />
  84. <div v-else>{{ rowNum(form.unitMedical) }}</div>
  85. </el-form-item>
  86. </el-col>
  87. <el-col :span="12">
  88. <el-form-item label="单位工伤险:">
  89. <el-input-number v-if="form.status !==3" v-model="form.unitInjury" size="small" placeholder="单位工伤险"
  90. :precision="2" :controls="false" style="width: 100%" @change="amountChangeHandler" />
  91. <div v-else>{{ rowNum(form.unitInjury) }}</div>
  92. </el-form-item>
  93. </el-col>
  94. <el-col :span="12">
  95. <el-form-item label="单位失业金:">
  96. <el-input-number v-if="form.status !==3" v-model="form.unitUnemployment" size="small"
  97. placeholder="单位失业金" :precision="2" :controls="false" style="width: 100%"
  98. @change="amountChangeHandler" />
  99. <div v-else>{{ rowNum(form.unitUnemployment) }}</div>
  100. </el-form-item>
  101. </el-col>
  102. <el-col :span="12">
  103. <el-form-item label="单位生育险:">
  104. <el-input-number v-if="form.status !==3" v-model="form.unitProcreate" size="small" placeholder="单位生育险"
  105. :precision="2" :controls="false" style="width: 100%" @change="amountChangeHandler" />
  106. <div v-else>{{ rowNum(form.unitProcreate) }}</div>
  107. </el-form-item>
  108. </el-col>
  109. <el-col :span="12">
  110. <el-form-item label="单位大病险:">
  111. <el-input-number v-if="form.status !==3" v-model="form.unitSeriousIllness" size="small"
  112. placeholder="单位大病险" :precision="2" :controls="false" style="width: 100%"
  113. @change="amountChangeHandler" />
  114. <div v-else>{{ rowNum(form.unitSeriousIllness) }}</div>
  115. </el-form-item>
  116. </el-col>
  117. <el-col :span="12">
  118. <el-form-item label="单位采暖费:">
  119. <el-input-number v-if="form.status !==3" v-model="form.unitHeatingFee" size="small" placeholder="单位大病险"
  120. :precision="2" :controls="false" style="width: 100%" @change="amountChangeHandler" />
  121. <div v-else>{{ rowNum(form.unitHeatingFee) }}</div>
  122. </el-form-item>
  123. </el-col>
  124. <el-col :span="12">
  125. <el-form-item label="个人养老金:">
  126. <el-input-number v-if="form.status !==3" v-model="form.individualPension" size="small"
  127. placeholder="个人养老金" :precision="2" :controls="false" style="width: 100%"
  128. @change="amountChangeHandler" />
  129. <div v-else>{{ rowNum(form.individualPension) }}</div>
  130. </el-form-item>
  131. </el-col>
  132. <el-col :span="12">
  133. <el-form-item label="个人医疗险:">
  134. <el-input-number v-if="form.status !==3" v-model="form.individualMedical" size="small"
  135. placeholder="个人医疗险" :precision="2" :controls="false" style="width: 100%"
  136. @change="amountChangeHandler" />
  137. <div v-else>{{ rowNum(form.individualMedical) }}</div>
  138. </el-form-item>
  139. </el-col>
  140. <el-col :span="12">
  141. <el-form-item label="个人失业金:">
  142. <el-input-number v-if="form.status !==3" v-model="form.individualUnemployment" size="small"
  143. placeholder="个人失业金" :precision="2" :controls="false" style="width: 100%"
  144. @change="amountChangeHandler" />
  145. <div v-else>{{ rowNum(form.individualUnemployment) }}</div>
  146. </el-form-item>
  147. </el-col>
  148. <el-col :span="12">
  149. <el-form-item label="个人大病险:">
  150. <el-input-number v-if="form.status !==3" v-model="form.individualSeriousIllness" size="small"
  151. placeholder="个人大病险" :precision="2" :controls="false" style="width: 100%"
  152. @change="amountChangeHandler" />
  153. <div v-else>{{ rowNum(form.individualSeriousIllness) }}</div>
  154. </el-form-item>
  155. </el-col>
  156. <el-col :span="12">
  157. <el-form-item label="合计:">
  158. <!-- <el-input-number
  159. v-model="form.amount"
  160. size="small"
  161. placeholder="合计"
  162. :precision="2"
  163. :controls="false"
  164. style="width: 100%"
  165. /> -->
  166. {{ rowNum(form.amount) }}
  167. </el-form-item>
  168. </el-col>
  169. <el-col :span="24">
  170. <el-divider />
  171. </el-col>
  172. <el-col :span="24">
  173. <el-form-item label="备注">
  174. <el-input v-model.trim="form.content" v-if="form.status !==3" maxlength="200" show-word-limit
  175. type="textarea" rows="2" />
  176. <div v-else>{{form.content}}</div>
  177. </el-form-item>
  178. </el-col>
  179. <el-col :span="24">
  180. <el-form-item label="凭证" required>
  181. <el-upload action="#" :http-request="upload" :with-credentials="true" :show-file-list="false" multiple>
  182. <el-button size="small" type="primary" icon="Upload" v-if="form.status !==3">点击上传</el-button>
  183. </el-upload>
  184. <el-table ref="dbTable" :data="form.evidenceFiles" size="small" border
  185. header-row-class-name="list-header-row" row-class-name="list-row">
  186. <el-table-column label="文件名" prop="originalFileName" align="center" show-overflow-tooltip>
  187. <template #default="scope">
  188. <el-button size="small" type="text" @click="openFile(scope.row)">{{
  189. scope.row.originalFileName == ""
  190. ? "打开文件"
  191. : scope.row.originalFileName
  192. }}</el-button>
  193. </template>
  194. </el-table-column>
  195. <!-- <el-table-column
  196. label="文件类型"
  197. width="80"
  198. prop="fileType"
  199. align="center"
  200. /> -->
  201. <el-table-column label="操作" width="80" prop="fileType" align="center">
  202. <template #default="scope">
  203. <el-button size="small" link type="danger" v-if=" form.status !== 3"
  204. @click="handlerEportFilesDel(scope.row, scope.$index)">删除</el-button>
  205. </template>
  206. </el-table-column>
  207. </el-table>
  208. </el-form-item>
  209. </el-col>
  210. <el-col :span="24">
  211. <el-form-item label="报表">
  212. <el-upload action="#" :http-request="uploadStatement" :with-credentials="true" :show-file-list="false"
  213. multiple>
  214. <el-button size="small" type="primary" icon="Upload" v-if="form.status !==3">点击上传</el-button>
  215. </el-upload>
  216. <el-table ref="dbTable" :data="form.reportFiles" size="small" border
  217. header-row-class-name="list-header-row" row-class-name="list-row">
  218. <el-table-column label="文件名" prop="originalFileName" align="center" show-overflow-tooltip>
  219. <template #default="scope">
  220. <el-button size="small" type="text" @click="openFile(scope.row)">{{
  221. scope.row.originalFileName == ""
  222. ? "打开文件"
  223. : scope.row.originalFileName
  224. }}</el-button>
  225. </template>
  226. </el-table-column>
  227. <el-table-column label="操作" width="80" prop="fileType" align="center">
  228. <template #default="scope">
  229. <el-button size="small" link type="danger" v-if=" form.status !== 3"
  230. @click="handleDel(scope.row, scope.$index)">删除</el-button>
  231. </template>
  232. </el-table-column>
  233. </el-table>
  234. </el-form-item>
  235. </el-col>
  236. </el-row>
  237. </el-form>
  238. </div>
  239. <div class="form-btns-container" style="height: 40px">
  240. <el-button size="small" v-if="form.status !== 3" icon="close"
  241. style="float: right; margin-left: 12px; margin-right: 12px" @click="close">
  242. 取消</el-button>
  243. <el-button type="primary" v-if="form.status !== 3" size="small" icon="Finished" style="float: right"
  244. @click="handleSave">
  245. 保存</el-button>
  246. <el-button v-hasPermi="['business:socialSecurityDeclare:edit']" style="float: right;" v-if="!stopUseBack"
  247. icon="back" size="small" type="warning" :disabled="
  248. form == null || form.status !== 3
  249. " @click="turnBack(form)">退回</el-button>
  250. </div>
  251. </div>
  252. <!-- <feedback-dialog ref="feedbackDialogView" :parent="this" />
  253. <print-dialog ref="printDialog" :parent="this" /> -->
  254. </el-dialog>
  255. </template>
  256. <script setup>
  257. import {
  258. getDetail,
  259. saveDetail, turnBackDetail
  260. } from "@/api/business/production/socialSecurityDeclare";
  261. import { uploadFile } from "@/api/tool/file";
  262. import { rowNum } from "@/utils/index";
  263. import { ref } from "vue";
  264. const { proxy } = getCurrentInstance();
  265. const visible = ref(false);
  266. const width = ref(800);
  267. const selections = ref([]);
  268. const currentSource = ref(null);
  269. const editStatus = ref(false);
  270. const canSave = ref(false);
  271. const loading = ref(false);
  272. const stopUseBack = ref(false);
  273. const currentMonth = ref(
  274. proxy.moment().format("YYYY-MM-01")
  275. );
  276. const baseUrl = ref(import.meta.env.VITE_APP_BASE_API);
  277. const props = defineProps({
  278. getList: {
  279. type: Function,
  280. default: () => { },
  281. },
  282. });
  283. const { getList } = toRefs(props);
  284. const total = ref(0);
  285. const employeeEmptyData = {
  286. id: null,
  287. title: "",
  288. remark: "",
  289. employeeName: "",
  290. departmentName: "",
  291. idCardImage: "",
  292. idCardImageBack: "",
  293. idiograph: "",
  294. details: [],
  295. editStatus: true,
  296. };
  297. const form = ref({});
  298. const emptyForm = {
  299. details: [],
  300. };
  301. function open(detail) {
  302. visible.value = true;
  303. currentMonth.value = proxy.moment().format("YYYY-MM-01")
  304. form.value = detail;
  305. console.log(detail);
  306. loadData();
  307. }
  308. function loadData() {
  309. loading.value = true;
  310. form.value.year = proxy.moment(currentMonth.value).format("YYYY");
  311. form.value.month = proxy.moment(currentMonth.value).format("MM");
  312. const { year, month, socialSecurityDeclareId, companyId } = form.value
  313. const clearForm = { year, month, socialSecurityDeclareId, companyId }
  314. getDetail(clearForm).then((res) => {
  315. form.value = { ...proxy.deepClone(emptyForm), ...res.data };
  316. // if (form.value.status === 2 || form.value.status === 3) {
  317. // proxy.$modal.msgError("该信息已提交待审核");
  318. // close();
  319. // }
  320. amountChangeHandler();
  321. }).finally(() => {
  322. loading.value = false;
  323. });
  324. }
  325. function changeMonthHandle() {
  326. // isView.value = true
  327. const nowDate = ref(
  328. proxy.moment().format("YYYY-MM-01")
  329. );
  330. let nowyear = proxy.moment(nowDate.value).format("YYYY");
  331. let nowmonth = proxy.moment(nowDate.value).format("MM");
  332. const year = proxy.moment(currentMonth.value).format("YYYY");
  333. const month = proxy.moment(currentMonth.value).format("MM");
  334. if (nowyear + nowmonth == year + month) {
  335. // isView.value = false
  336. stopUseBack.value = false
  337. } else {
  338. stopUseBack.value = true
  339. }
  340. loadData()
  341. }
  342. function close() {
  343. visible.value = false;
  344. reset();
  345. }
  346. function reset() {
  347. form.value = proxy.deepClone(emptyForm);
  348. canSave.value = false;
  349. }
  350. function handleCurrentChange(row) {
  351. currentSource.value = row;
  352. }
  353. function turnBack(detail) {
  354. loading.value = true
  355. form.value.status = 1;
  356. form.value.year = proxy.moment(currentMonth.value).format("YYYY");
  357. form.value.month = proxy.moment(currentMonth.value).format("MM");
  358. turnBackDetail(form.value)
  359. .then((res) => {
  360. getList.value();
  361. })
  362. .catch((err) => {
  363. proxy.$modal.msgError(err.message);
  364. }).finally(() => {
  365. loading.value = false
  366. visible.value = false;
  367. });
  368. }
  369. function handleCheckChange(selection) {
  370. selections.value = selection.map((item) => item);
  371. }
  372. function handleSave() {
  373. if (form.value.isFirstSocialSecurity === 0) {
  374. if (!form.value.governmentAccountNo) {
  375. proxy.$modal.msgError("请输入政务网账号");
  376. return;
  377. }
  378. if (!form.value.governmentPassword) {
  379. proxy.$modal.msgError("请输入政务网密码");
  380. return;
  381. }
  382. if (!passwordCheck(form.value.governmentPassword)) {
  383. proxy.$modal.msgError("请输入正确的政务网密码");
  384. return;
  385. }
  386. if (!form.value.socialSecurityAccountNo) {
  387. proxy.$modal.msgError("请输入社保账号");
  388. return;
  389. }
  390. if (!form.value.socialSecurityPassword) {
  391. proxy.$modal.msgError("请输入社保密码");
  392. return;
  393. }
  394. if (!passwordCheck(form.value.socialSecurityPassword)) {
  395. proxy.$modal.msgError("请输入正确的社保密码");
  396. return;
  397. }
  398. if (!form.value.employeePassword) {
  399. proxy.$modal.msgError("请输入用工密码");
  400. return;
  401. }
  402. if (!passwordCheck(form.value.employeePassword)) {
  403. proxy.$modal.msgError("请输入正确的用工密码");
  404. return;
  405. }
  406. }
  407. if (
  408. form.value.evidenceFiles == null ||
  409. form.value.evidenceFiles.length === 0
  410. ) {
  411. proxy.$modal.msgError("请上传凭证");
  412. return;
  413. }
  414. // if (form.value.reportFiles == null || form.value.reportFiles.length === 0) {
  415. // proxy.$modal.msgError("请上传报表");
  416. // return;
  417. // }
  418. proxy.$modal
  419. .confirm("确认保存么?")
  420. .then(() => {
  421. const saveValue = proxy.deepClone(form.value);
  422. saveValue.status = 3;
  423. saveValue.year = proxy.moment(currentMonth.value).format("YYYY");
  424. saveValue.month = proxy.moment(currentMonth.value).format("MM");
  425. saveDetail(saveValue).then((res) => {
  426. proxy.$modal.msgSuccess("保存成功");
  427. reset();
  428. close();
  429. getList.value();
  430. });
  431. })
  432. .catch((err) => {
  433. proxy.$modal.msg("取消保存");
  434. });
  435. }
  436. function passwordCheckHandler(value, field) {
  437. // console.log(value)
  438. if (!passwordCheck(form.value[field])) {
  439. proxy.$modal.msgError("请输入正确密码");
  440. }
  441. }
  442. function passwordCheck(value) {
  443. const pattern = /^[A-Za-z0-9~!@#$%^&*()_+-=]*$/;
  444. if (!pattern.test(value)) {
  445. return false;
  446. }
  447. return true;
  448. }
  449. function upload(param) {
  450. const formData = new FormData();
  451. formData.append("file", param.file);
  452. uploadFile(formData).then((res) => {
  453. if (res.code === 200) {
  454. const file = {};
  455. file.fileName = res.newFileName;
  456. file.url = res.url;
  457. file.fileType =
  458. res.newFileName.split(".")[res.newFileName.split(".").length - 1];
  459. file.originalFileName = res.originalFilename;
  460. file.fileUrl = res.fileName;
  461. form.value.evidenceFiles.push(file);
  462. }
  463. });
  464. }
  465. function uploadStatement(param) {
  466. const formData = new FormData();
  467. formData.append("file", param.file);
  468. uploadFile(formData).then((res) => {
  469. if (res.code === 200) {
  470. const file = {};
  471. file.fileName = res.newFileName;
  472. file.url = res.url;
  473. file.fileType =
  474. res.newFileName.split(".")[res.newFileName.split(".").length - 1];
  475. file.originalFileName = res.originalFilename;
  476. file.fileUrl = res.fileName;
  477. form.value.reportFiles.push(file);
  478. }
  479. });
  480. }
  481. function openFile(row) {
  482. window.open(`${baseUrl.value}${row.fileUrl}`);
  483. }
  484. function changeEdit() {
  485. editStatus.value = !editStatus.value;
  486. }
  487. function amountChangeHandler() {
  488. let amount = 0;
  489. amount += form.value.unitInjury == null ? 0 : form.value.unitInjury;
  490. amount += form.value.unitMedical == null ? 0 : form.value.unitMedical;
  491. amount += form.value.unitPension == null ? 0 : form.value.unitPension;
  492. amount += form.value.unitProcreate == null ? 0 : form.value.unitProcreate;
  493. amount +=
  494. form.value.unitSeriousIllness == null ? 0 : form.value.unitSeriousIllness;
  495. amount +=
  496. form.value.unitUnemployment == null ? 0 : form.value.unitUnemployment;
  497. amount +=
  498. form.value.individualMedical == null ? 0 : form.value.individualMedical;
  499. amount +=
  500. form.value.individualPension == null ? 0 : form.value.individualPension;
  501. amount +=
  502. form.value.individualSeriousIllness == null
  503. ? 0
  504. : form.value.individualSeriousIllness;
  505. amount +=
  506. form.value.individualUnemployment == null
  507. ? 0
  508. : form.value.individualUnemployment;
  509. amount += form.value.unitHeatingFee == null ? 0 : form.value.unitHeatingFee;
  510. form.value.amount = amount;
  511. canSave.value =
  512. form.value.unitInjury !== undefined &&
  513. form.value.unitMedical !== undefined &&
  514. form.value.unitPension !== undefined &&
  515. form.value.unitProcreate !== undefined &&
  516. form.value.unitSeriousIllness !== undefined &&
  517. form.value.unitUnemployment !== undefined &&
  518. form.value.individualMedical !== undefined &&
  519. form.value.individualPension !== undefined &&
  520. form.value.individualSeriousIllness !== undefined &&
  521. form.value.individualUnemployment !== undefined &&
  522. form.value.unitHeatingFee !== undefined;
  523. }
  524. function handlerEportFilesDel(row, index) {
  525. proxy.$modal
  526. .confirm("确定删除吗?")
  527. .then((_) => {
  528. form.value.evidenceFiles.splice(index, 1);
  529. })
  530. .catch((_) => {
  531. proxy.$modal.msg("已取消删除");
  532. });
  533. }
  534. function handleDel(row, index) {
  535. proxy.$modal
  536. .confirm("确定删除吗?")
  537. .then((_) => {
  538. form.value.reportFiles.splice(index, 1);
  539. })
  540. .catch((_) => {
  541. proxy.$modal.msg("已取消删除");
  542. });
  543. }
  544. // 暴露给父组件的方法
  545. defineExpose({
  546. open,
  547. });
  548. </script>
  549. <style scoped>
  550. .img {
  551. width: 23px;
  552. height: 23px;
  553. display: flex;
  554. justify-content: center;
  555. align-items: center;
  556. }
  557. ::v-deep(.el-upload) {
  558. display: flex;
  559. text-align: center;
  560. justify-content: center;
  561. cursor: pointer;
  562. outline: 0;
  563. }
  564. .required::after {
  565. content: "*";
  566. color: red;
  567. }
  568. </style>