view.vue 22 KB

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