Payroll.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. <template>
  2. <div>
  3. <div class="payroll-all">
  4. <div class="payroll-head">
  5. <div class="payroll-head-li">
  6. <el-date-picker
  7. v-model="value2"
  8. type="month"
  9. placeholder="选择月"
  10. @change="PickTime()">
  11. </el-date-picker>
  12. </div>
  13. <div class="payroll-head-li">
  14. <el-button type="primary" @click="addsalary()">新增</el-button>
  15. <el-button type="primary">c</el-button>
  16. <el-button type="primary">四川公司工资单</el-button>
  17. <el-button type="primary">纽茵公司工资单</el-button>
  18. </div>
  19. </div>
  20. <div class="payroll-table">
  21. <template>
  22. <el-table
  23. :data="tableData"
  24. border
  25. style="width: 100%">
  26. <el-table-column
  27. prop="yearMonth"
  28. label="年月"
  29. width="80">
  30. </el-table-column>
  31. <el-table-column
  32. prop="name"
  33. label="员工"
  34. width="80">
  35. </el-table-column>
  36. <el-table-column
  37. prop="startDate"
  38. label="起止日期"
  39. width="220">
  40. <template slot-scope="scope">
  41. <div class="sub-box">{{scope.row.startDate+'~'+scope.row.endDate}}</div>
  42. </template>
  43. </el-table-column>
  44. <el-table-column
  45. prop="should"
  46. label="应发合计"
  47. width="100">
  48. </el-table-column>
  49. <el-table-column
  50. prop="totalDeductions"
  51. label="扣款合计"
  52. width="100">
  53. </el-table-column>
  54. <el-table-column
  55. prop="name"
  56. label="税前合计 "
  57. width="100">
  58. </el-table-column>
  59. <el-table-column
  60. prop="withholdingTax"
  61. label="代缴个税"
  62. width="100">
  63. </el-table-column>
  64. <el-table-column
  65. prop="afterTax"
  66. label="税后合计"
  67. width="100">
  68. </el-table-column>
  69. <el-table-column
  70. prop="lastUpdateUserName"
  71. label="最后操作人"
  72. width="100">
  73. </el-table-column>
  74. <el-table-column
  75. prop="lastUpdateDt"
  76. label="最后时间"
  77. width="150">
  78. </el-table-column>
  79. <el-table-column
  80. prop="name"
  81. label="操 作">
  82. <!-- eslint-disable-next-line -->
  83. <template slot-scope="scope">
  84. <el-button type="text" @click="SalaryDetails(scope.$index, scope.row)">Dialog</el-button>
  85. </template>
  86. </el-table-column>
  87. </el-table>
  88. </template>
  89. </div>
  90. <el-dialog top="3.5vh" title="薪资详细信息" :visible.sync="dialogFormVisible">
  91. <el-form :model="form">
  92. <div class="payroll-inif">
  93. <el-form-item label="员工" :label-width="formLabelWidth">
  94. <el-select size="medium" style="height:36px" :disabled="disabled" v-model="salaryinif.userId" filterable placeholder="请选择">
  95. <el-option
  96. v-for="item in userlist"
  97. :key="item.id"
  98. :label="item.cnName"
  99. :value="item.id">
  100. </el-option>
  101. </el-select>
  102. </el-form-item>
  103. <el-form-item label="年月" :label-width="formLabelWidth">
  104. <el-date-picker @change="Rangetime()" v-model="salaryinif.yearMonth" size="medium" type="month" placeholder="选择月"></el-date-picker>
  105. </el-form-item>
  106. <el-form-item label="工资日期起" :label-width="formLabelWidth">
  107. <el-date-picker v-model="salaryinif.startDate" size="medium" type="date" placeholder="选择日期"></el-date-picker>
  108. </el-form-item>
  109. <el-form-item label="工资日期止" :label-width="formLabelWidth">
  110. <el-date-picker v-model="salaryinif.endDate" size="medium" type="date" placeholder="选择日期"></el-date-picker>
  111. </el-form-item>
  112. <el-form-item label="基本工资" :label-width="formLabelWidth">
  113. <el-input-number :precision="2" size="medium" :controls="false" v-model="salaryinif.basic"></el-input-number>
  114. </el-form-item>
  115. <el-form-item label="绩效工资" :label-width="formLabelWidth">
  116. <el-input-number :precision="2" size="medium" :controls="false" v-model="salaryinif.floats"></el-input-number>
  117. </el-form-item>
  118. <el-form-item label="岗位津贴" :label-width="formLabelWidth">
  119. <el-input-number :precision="2" size="medium" :controls="false" v-model="salaryinif.postAllowance"></el-input-number>
  120. </el-form-item>
  121. <el-form-item label="服装洗理补贴" :label-width="formLabelWidth">
  122. <el-input-number :precision="2" size="medium" :controls="false" v-model="salaryinif.garmentWashSubsidies"></el-input-number>
  123. </el-form-item>
  124. <el-form-item label="通讯补贴" :label-width="formLabelWidth">
  125. <el-input-number :precision="2" size="medium" :controls="false" v-model="salaryinif.communicationSubsidies"></el-input-number>
  126. </el-form-item>
  127. <el-form-item label="交通补贴" :label-width="formLabelWidth">
  128. <el-input-number :precision="2" size="medium" :controls="false" v-model="salaryinif.trafficSubsidies"></el-input-number>
  129. </el-form-item>
  130. <el-form-item label="保密费" :label-width="formLabelWidth">
  131. <el-input-number :precision="2" size="medium" :controls="false" v-model="salaryinif.informationSecurityFee"></el-input-number>
  132. </el-form-item>
  133. <el-form-item label="操作奖金" :label-width="formLabelWidth">
  134. <el-input-number :precision="2" size="medium" :controls="false" v-model="salaryinif.operationBonus"></el-input-number>
  135. </el-form-item>
  136. <el-form-item label="其他补贴" :label-width="formLabelWidth">
  137. <el-input-number :precision="2" size="medium" :controls="false" v-model="salaryinif.otherSubsidies"></el-input-number>
  138. </el-form-item>
  139. <el-form-item label="部门集体团建费" :label-width="formLabelWidth">
  140. <el-input-number :precision="2" size="medium" :controls="false" v-model="salaryinif.groupCost"></el-input-number>
  141. </el-form-item>
  142. <el-form-item label="过节费" :label-width="formLabelWidth">
  143. <el-input-number :precision="2" size="medium" :controls="false" v-model="salaryinif.specialAllowance"></el-input-number>
  144. </el-form-item>
  145. <el-form-item label="代扣保险" :label-width="formLabelWidth">
  146. <el-input-number :precision="2" size="medium" :controls="false" v-model="salaryinif.withholdingInsurance"></el-input-number>
  147. </el-form-item>
  148. <el-form-item label="代扣公积金" :label-width="formLabelWidth">
  149. <el-input-number :precision="2" size="medium" :controls="false" v-model="salaryinif.reservedFunds"></el-input-number>
  150. </el-form-item>
  151. <el-form-item label="代缴个税" :label-width="formLabelWidth">
  152. <el-input-number :precision="2" size="medium" :controls="false" v-model="salaryinif.withholdingTax"></el-input-number>
  153. </el-form-item>
  154. <el-form-item label="餐补" :label-width="formLabelWidth">
  155. <el-input-number :precision="2" size="medium" :controls="false" v-model="salaryinif.mealsupplement"></el-input-number>
  156. </el-form-item>
  157. </div>
  158. <div class="leave-inif">
  159. <el-form-item label="事假" :label-width="formLabelWidth">
  160. <span>{{salaryinif.somethingFalse}} (共 0 小时)</span>
  161. </el-form-item>
  162. <el-form-item label="病假" :label-width="formLabelWidth">
  163. <span>{{salaryinif.sickLeave}} (共 0 小时)</span>
  164. </el-form-item>
  165. <el-form-item label="迟到" :label-width="formLabelWidth">
  166. <span>{{salaryinif.lateTo}} (30分钟以下共次,30分钟以上共次,60分钟以上共次,2小时以上共次)</span>
  167. </el-form-item>
  168. <el-form-item label="早退" :label-width="formLabelWidth">
  169. <span>{{salaryinif.leaveEarly}} (10分钟以下共次,10-30分钟共次,30-60分钟共次,1小时以上共次)</span>
  170. </el-form-item>
  171. <el-form-item label="旷工" :label-width="formLabelWidth">
  172. <span>{{salaryinif.absenteeism}} (共 0 小时)</span>
  173. </el-form-item>
  174. <el-form-item label="未打卡" :label-width="formLabelWidth">
  175. <span>{{salaryinif.notPunch}} (未打卡共次)</span>
  176. </el-form-item>
  177. </div>
  178. <div class="salary-payments">
  179. <el-form-item label="其他扣款" :label-width="formLabelWidth">
  180. <span>{{salaryinif.otherDeductions}}</span>
  181. </el-form-item>
  182. <el-form-item label="应发合计" :label-width="formLabelWidth">
  183. <span>{{salaryinif.should}}</span>
  184. </el-form-item>
  185. <el-form-item label="扣款合计" :label-width="formLabelWidth">
  186. <span>{{salaryinif.totalDeductions}}</span>
  187. </el-form-item>
  188. <el-form-item label="税前合计" :label-width="formLabelWidth">
  189. <span>{{salaryinif.afterTax}}</span>
  190. </el-form-item>
  191. <el-form-item label="税后合计" :label-width="formLabelWidth">
  192. <span>{{salaryinif.afterTax}}</span>
  193. </el-form-item>
  194. </div>
  195. <div class="remark-box">
  196. <el-form-item label="备注" :label-width="formLabelWidth">
  197. <el-input :rows="1" type="textarea" v-model="salaryinif.remark"></el-input>
  198. </el-form-item>
  199. </div>
  200. </el-form>
  201. <div slot="footer" class="dialog-footer">
  202. <el-button v-if="disabled" type="primary" @click="salaryAD('修改')">确认修改</el-button>
  203. <el-button v-if="preserve" type="primary" @click="salaryAD('新增')">保 存</el-button>
  204. <el-button @click="dialogFormVisible = false">取 消</el-button>
  205. </div>
  206. </el-dialog>
  207. </div>
  208. </div>
  209. </template>
  210. <script>
  211. export default {
  212. data() {
  213. return {
  214. userlist:[],
  215. loginuserid:'',
  216. value2:'',
  217. tableData: [],
  218. dialogTableVisible: false,
  219. dialogFormVisible: false,
  220. disabled:true,
  221. preserve:'',
  222. //薪资详细
  223. salaryinif:{
  224. userId:"",//员工Id
  225. name:"",//姓名
  226. yearMonth:"",//年月
  227. startDate:"",//工资日期 起
  228. endDate:"",//工资日期 止
  229. basic:"",//基本工资
  230. floats:"",//绩效工资
  231. postAllowance:"",//岗位津贴
  232. garmentWashSubsidies:"",//服装洗理补贴
  233. communicationSubsidies:"",// 通讯补贴
  234. trafficSubsidies:"",// 交通补贴
  235. informationSecurityFee:"",// 保密费
  236. operationBonus:"",// 操作奖金
  237. specialAllowance:"",// 特殊津贴
  238. otherSubsidies:"",// 其他补贴
  239. withholdingInsurance:"",// 代扣保险
  240. mealsupplement:"",// 餐补
  241. reservedFunds:"",// 代扣公积金
  242. groupCost:"",// 部门集体团建费
  243. sickLeave:"",// 病假
  244. somethingFalse:"",// 事假
  245. lateTo:"",// 迟到
  246. leaveEarly:"",// 早退
  247. absenteeism:"",//旷工
  248. notPunch:"",//未打卡
  249. otherDeductions:"",//其他扣款
  250. should:"",//应发合计
  251. totalDeductions:"",//扣款合计
  252. totalRealHair:"",//实发合计
  253. withholdingTax:"",//代扣个税
  254. afterTax:"",//税后工资
  255. isLock:"",//锁定标识
  256. lastUpdateUserId:"",//最后操作人
  257. lastUpdateUserName:"",//最后操作人Name
  258. lastUpdateDt:"",//最后操作时间
  259. remark:"",//备注
  260. },
  261. form: {
  262. name: '',
  263. region: '',
  264. },
  265. formLabelWidth: '120px'
  266. }
  267. },
  268. methods:{
  269. Rangetime(){
  270. console.log('2023-10' instanceof Date)
  271. console.log(this.salaryinif.startDate instanceof Date)
  272. },
  273. getnewDate(){
  274. let nowDate = new Date()
  275. let date = {
  276. year: nowDate.getFullYear(),
  277. month: nowDate.getMonth() + 1,
  278. date: nowDate.getDate()
  279. }
  280. console.log(date.year + '-' + date.month)
  281. this.value2=date.year + '-' + date.month;
  282. this.GetWageSheetList();
  283. },
  284. //获取员工
  285. GetWageSheetBasicsDataSource(){
  286. var url = "/api/PersonnelModule/GetWageSheetBasicsDataSource"
  287. var that = this
  288. this.$axios({
  289. method: 'post',
  290. url: url,
  291. headers: {
  292. Authorization: 'Bearer ' + this.token
  293. }
  294. }).then(function (res) {
  295. if(res.data.code==200){
  296. console.log(res.data.data.userNames)
  297. that.userlist=res.data.data.userNames
  298. }else{
  299. that.$message({
  300. message: '加载失败!原因:'+res.data.msg,
  301. type: 'warning'
  302. });
  303. }
  304. })
  305. },
  306. //薪资列表
  307. GetWageSheetList(){
  308. var url = "/api/PersonnelModule/GetWageSheetList"
  309. var that = this
  310. this.$axios({
  311. method: 'post',
  312. url: url,
  313. headers: {
  314. Authorization: 'Bearer ' + this.token
  315. },
  316. data:{
  317. portType: 1,
  318. yearMonth: that.value2,
  319. }
  320. }).then(function (res) {
  321. that.tableData=[];
  322. if(res.data.code==200){
  323. console.log(res)
  324. that.tableData=res.data.data;
  325. console.log( that.tableData)
  326. }else{
  327. that.$message({
  328. message: '加载失败!原因:'+res.data.msg,
  329. type: 'warning'
  330. });
  331. }
  332. })
  333. },
  334. //日期处理(日)
  335. TimeProcessingri(val){
  336. if(val instanceof Date){
  337. let newsyear=val.getFullYear();
  338. let newsMonth=val.getMonth() + 1;
  339. let newsday=val.getDate();
  340. if((val.getMonth() + 1)<10){
  341. newsMonth='0'+newsMonth
  342. }else{
  343. newsMonth=val.getMonth() + 1
  344. }
  345. return newsyear+ '-' +newsMonth+ '-' + newsday;
  346. }else{
  347. return val
  348. }
  349. },
  350. //日期处理(月)
  351. TimeProcessingyue(val){
  352. if(val instanceof Date){
  353. let newsyear=val.getFullYear();
  354. let newsMonth=val.getMonth() + 1;
  355. if((val.getMonth() + 1)<10){
  356. newsMonth='0'+newsMonth
  357. }else{
  358. newsMonth=val.getMonth() + 1
  359. }
  360. return newsyear+ '-' +newsMonth;
  361. }else{
  362. return val
  363. }
  364. },
  365. //时间切换
  366. PickTime(){
  367. let newyear=this.value2.getFullYear();
  368. let newMonth=this.value2.getMonth() + 1;
  369. if((this.value2.getMonth() + 1)<10){
  370. newMonth='0'+newMonth
  371. }else{
  372. newMonth=this.value2.getMonth() + 1
  373. }
  374. this.value2=newyear+ '-' +newMonth;
  375. console.log(this.value2)
  376. this.GetWageSheetList();
  377. },
  378. //薪资详细
  379. SalaryDetails(index, row){
  380. this.dialogFormVisible = true;
  381. this.disabled=true;
  382. this.preserve=false;
  383. console.log(row.id)
  384. var url = "/api/PersonnelModule/GetWageSheetById"
  385. var that = this
  386. this.$axios({
  387. method: 'post',
  388. url: url,
  389. headers: {
  390. Authorization: 'Bearer ' + this.token
  391. },
  392. data:{
  393. portType: 1,
  394. id: row.id,
  395. }
  396. }).then(function (res) {
  397. if(res.data.code==200){
  398. console.log(res)
  399. that.salaryinif=res.data.data;
  400. }else{
  401. that.$message({
  402. message: '加载失败!原因:'+res.data.msg,
  403. type: 'warning'
  404. });
  405. }
  406. })
  407. },
  408. //薪资(新增,修改)API
  409. PostWageSheetAddOrEdit(inif){
  410. console.log(inif)
  411. var url = "/api/PersonnelModule/PostWageSheetAddOrEdit"
  412. var that = this
  413. this.$axios({
  414. method: 'post',
  415. url: url,
  416. headers: {
  417. Authorization: 'Bearer ' + this.token
  418. },
  419. data:{
  420. status:inif.statuss,
  421. createUserId:that.loginuserid,
  422. userId:that.salaryinif.userId,
  423. id:inif.ids,
  424. remark:that.salaryinif.remark,
  425. yearMonth:that.TimeProcessingyue(that.salaryinif.yearMonth),
  426. startDate:that.TimeProcessingri(that.salaryinif.startDate),
  427. endDate:that.TimeProcessingri(that.salaryinif.endDate),
  428. basic:that.salaryinif.basic,
  429. floats:that.salaryinif.floats,
  430. postAllowance:that.salaryinif.postAllowance,
  431. garmentWashSubsidies:that.salaryinif.garmentWashSubsidies,
  432. communicationSubsidies:that.salaryinif.communicationSubsidies,
  433. trafficSubsidies:that.salaryinif.trafficSubsidies,
  434. informationSecurityFee:that.salaryinif.informationSecurityFee,
  435. operationBonus:that.salaryinif.operationBonus,
  436. specialAllowance:that.salaryinif.specialAllowance,
  437. otherSubsidies:that.salaryinif.otherSubsidies,
  438. withholdingInsurance:that.salaryinif.withholdingInsurance,
  439. mealsupplement:that.salaryinif.mealsupplement,
  440. reservedFunds:that.salaryinif.reservedFunds,
  441. groupCost:that.salaryinif.groupCost,
  442. sickLeave:that.salaryinif.sickLeave,
  443. somethingFalse:that.salaryinif.somethingFalse,
  444. lateTo:that.salaryinif.lateTo,
  445. leaveEarly:that.salaryinif.leaveEarly,
  446. absenteeism:that.salaryinif.absenteeism,
  447. notPunch:that.salaryinif.notPunch,
  448. otherDeductions:that.salaryinif.otherDeductions,
  449. should:that.salaryinif.should,
  450. totalDeductions:that.salaryinif.totalDeductions,
  451. totalRealHair:that.salaryinif.totalRealHair,
  452. withholdingTax:that.salaryinif.withholdingTax,
  453. afterTax:that.salaryinif.afterTax,
  454. }
  455. }).then(function (res) {
  456. if(res.data.code==200){
  457. console.log(res)
  458. }else{
  459. that.$message({
  460. message: '加载失败!原因:'+res.data.msg,
  461. type: 'warning'
  462. });
  463. }
  464. })
  465. },
  466. //薪资(新增,修改)
  467. salaryAD(text){
  468. this.dialogFormVisible = false;
  469. let inifadd={
  470. statuss:'',
  471. userIds:'',
  472. ids:''
  473. }
  474. if(text=='新增'){
  475. inifadd.statuss=1;
  476. inifadd.userIds=0;
  477. inifadd.ids=0;
  478. this.PostWageSheetAddOrEdit(inifadd)
  479. }else if(text=='修改'){
  480. inifadd.statuss=2;
  481. inifadd.userIds=this.salaryinif.userId;
  482. inifadd.ids=this.salaryinif.id;
  483. this.PostWageSheetAddOrEdit(inifadd)
  484. }
  485. },
  486. //新增薪资
  487. addsalary(){
  488. this.dialogFormVisible = true;
  489. this.disabled=false;
  490. this.preserve=true;
  491. this.salaryinif={};
  492. }
  493. },
  494. mounted(){
  495. this.GetWageSheetBasicsDataSource()
  496. this.loginuserid=JSON.parse(localStorage.getItem('userinif')).userInfo.userId;
  497. this.getnewDate();
  498. }
  499. }
  500. </script>
  501. <style>
  502. .payroll-all{
  503. background-color: #fff;
  504. padding: 10px;
  505. box-shadow: 0 0 5px #0005;
  506. border-radius: 10px;
  507. height: 100%;
  508. min-height: 840px;
  509. }
  510. .payroll-head-li label{
  511. color: #606266;
  512. font-size: 15px;
  513. font-weight: 600;
  514. }
  515. .payroll-head{
  516. display: flex;
  517. justify-content: space-between;
  518. margin-bottom: 20px;
  519. }
  520. .payroll-inif{
  521. display: flex;
  522. flex-wrap: wrap;
  523. justify-content: space-between;
  524. margin: 0 80px;
  525. }
  526. .payroll-inif .el-form-item{
  527. width: 350px;
  528. }
  529. .payroll-inif .el-input-number--medium{
  530. width: 218px;
  531. }
  532. .payroll-inif .el-form-item{
  533. margin-bottom: 2px;
  534. }
  535. .payroll-inif .el-input--medium .el-input__inner{
  536. text-align: left;
  537. }
  538. .leave-inif{
  539. margin: 0 80px;
  540. }
  541. .leave-inif .el-form-item{
  542. margin-bottom: 0px;
  543. }
  544. .salary-payments{
  545. display: flex;
  546. flex-wrap: wrap;
  547. justify-content: space-between;
  548. margin: 0 80px;
  549. }
  550. .salary-payments .el-form-item{
  551. margin-bottom: 0px;
  552. font-size: 17px;
  553. font-weight: 600;
  554. }
  555. .payroll-all .el-dialog__body{
  556. padding: 16px 20px;
  557. }
  558. .remark-box{
  559. margin: 0 80px;
  560. }
  561. .payroll-inif .el-input--medium {
  562. width: 218px;
  563. }
  564. </style>