You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							336 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							336 lines
						
					
					
						
							10 KiB
						
					
					
				| 'use strict'; | |
| const moment = require('moment') | |
| const fs = require('fs'); | |
| 
 | |
| async function salesList(ctx) { | |
|    try { | |
|       const { memberList, packageUserData } = ctx.app.fs.utils | |
|       const { | |
|          keywordTarget, keyword, limit, page, state, | |
|          hiredateStart, hiredateEnd, marital, native, workPlace, | |
|          orderBy, orderDirection, placeSearch | |
|       } = ctx.query | |
| 
 | |
|       const userRes = await memberList({ | |
|          keywordTarget, keyword, limit: '', page: '', state, | |
|          hiredateStart, hiredateEnd, marital, native, workPlace, | |
|          orderBy, orderDirection, | |
|          nowAttendanceTime: true | |
|       }) | |
| 
 | |
|       let { packageUser: members } = await packageUserData(userRes, { | |
|          state: true, | |
|       }) | |
| 
 | |
|       const { models } = ctx.fs.dc; | |
| 
 | |
|       let mIds = members.map(m => m.pepUserId); | |
| 
 | |
| 
 | |
|       let where = { | |
|          del: false, | |
|          pepUserId: { $in: mIds } | |
|       } | |
|       if (placeSearch) { | |
|          where.$or = [{ | |
|             provinces: { $like: `%${placeSearch}%` } | |
|          }, { | |
|             cities: { $like: `%${placeSearch}%` } | |
|          }] | |
|       } | |
|       let res = await models.SalesDistribution.findAndCountAll({ | |
|          where: where, | |
|          offset: Number(page) * Number(limit), | |
|          limit: Number(limit), | |
|          order: [['id', 'DESC']] | |
|       }) | |
| 
 | |
|       let rslt = [] | |
|       res.rows.map(d => { | |
|          let info = members.find(m => m.pepUserId == d.dataValues.pepUserId); | |
|          let item = { | |
|             name: info.userName, | |
|             userCode: info.userCode, | |
|             post: info.userPost, | |
|             department: info.departmrnt, | |
|             hireDate: info.hiredate,//入职时间 | |
|             regularDate: info.regularDate,//转正时间 | |
|             ...d.dataValues | |
|          } | |
|          rslt.push(item); | |
|       }) | |
|       ctx.status = 200; | |
|       ctx.body = { | |
|          count: res.count, | |
|          rows: rslt | |
|       }; | |
|    } catch (error) { | |
|       ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); | |
|       ctx.status = 400; | |
|       ctx.body = { | |
|          message: typeof error == 'string' ? error : undefined | |
|       } | |
|    } | |
| } | |
| 
 | |
| async function add(ctx) { | |
|    try { | |
|       const { models } = ctx.fs.dc; | |
|       const { pepUserId, provinces, cities, businessLines } = ctx.request.body | |
| 
 | |
|       const existRes = await models.SalesDistribution.findOne({ | |
|          where: { pepUserId } | |
|       }) | |
| 
 | |
|       if (existRes && !existRes.del) { | |
|          throw '当前销售人员信息已存在' | |
|       } | |
| 
 | |
|       let storageData = { pepUserId, provinces, cities, businessLines, del: false } | |
|       if (existRes && existRes.del) { | |
|          await models.SalesDistribution.update(storageData, { | |
|             where: { pepUserId } | |
|          }) | |
|       } else { | |
|          await models.SalesDistribution.create(storageData) | |
|       } | |
|       ctx.status = 204; | |
|    } catch (error) { | |
|       ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); | |
|       ctx.status = 400; | |
|       ctx.body = { | |
|          message: typeof error == 'string' ? error : undefined | |
|       } | |
|    } | |
| } | |
| 
 | |
| async function edit(ctx) { | |
|    try { | |
|       const { models } = ctx.fs.dc; | |
|       const { pepUserId, provinces, cities, businessLines } = ctx.request.body | |
| 
 | |
|       const existRes = await models.SalesDistribution.findOne({ | |
|          where: { pepUserId } | |
|       }) | |
| 
 | |
|       if (!existRes) { | |
|          throw '当前销售人员信息不存在' | |
|       } | |
| 
 | |
|       let storageData = { pepUserId, provinces, cities, businessLines, del: false } | |
| 
 | |
|       await models.SalesDistribution.update(storageData, { | |
|          where: { | |
|             pepUserId: pepUserId | |
|          } | |
|       }) | |
| 
 | |
|       ctx.status = 204; | |
|    } catch (error) { | |
|       ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); | |
|       ctx.status = 400; | |
|       ctx.body = { | |
|          message: typeof error == 'string' ? error : undefined | |
|       } | |
|    } | |
| } | |
| 
 | |
| async function del(ctx) { | |
|    try { | |
|       const { models } = ctx.fs.dc; | |
|       const { pepUserId } = ctx.query | |
| 
 | |
|       await models.SalesDistribution.update({ | |
|          del: true, | |
|       }, { | |
|          where: { | |
|             pepUserId, | |
|          } | |
|       }) | |
|       ctx.status = 204; | |
|    } catch (error) { | |
|       ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); | |
|       ctx.status = 400; | |
|       ctx.body = { | |
|          message: typeof error == 'string' ? error : undefined | |
|       } | |
|    } | |
| } | |
| 
 | |
| // async function exportData(ctx) { | |
| //    try { | |
| //       const { models } = ctx.fs.dc; | |
| //       const { clickHouse, opts: { qiniu } } = ctx.app.fs | |
| //       const { simpleExcelDown, memberList, packageUserData } = ctx.app.fs.utils | |
| //       const { | |
| //          keywordTarget, keyword, limit, page, state, keys = '', | |
| //          hiredateStart, hiredateEnd, marital, native, workPlace, | |
| //          orderBy, orderDirection, | |
| //       } = ctx.query | |
|  | |
| //       const userRes = await memberList({ | |
| //          keywordTarget, keyword, limit, page, state, | |
| //          hiredateStart, hiredateEnd, marital, native, workPlace, | |
| //          orderBy, orderDirection, | |
| //          nowAttendanceTime: true | |
| //       }) | |
|  | |
| //       const tableAttributes = models['Member'].tableAttributes | |
| //       const optionKeys = keys.split(',') | |
|  | |
| //       let { packageUser: exportD, pepUserIds } = await packageUserData(userRes) | |
|  | |
| //       let preHeader = [{ | |
| //          title: '员工编号', | |
| //          key: 'userCode', | |
| //       }, { | |
| //          title: '姓名', | |
| //          key: 'userName', | |
| //       }] | |
| //       let header = [].concat(preHeader) | |
| //       for (let k in tableAttributes) { | |
| //          const comment = tableAttributes[k].comment | |
| //          if (k != 'id' && k != 'pepUserId' && comment) { | |
| //             if ([].includes(k)) { | |
| //                // 截住不想导出的字段 | |
| //                continue | |
| //             } | |
| //             header.push({ | |
| //                title: comment || '-', | |
| //                key: k, | |
| //                // index: tableAttributes[k].index, | |
| //             }) | |
| //          } | |
| //       } | |
|  | |
| //       if (optionKeys.includes('overtimeStatistic')) { | |
| //          header = header.concat([{ | |
| //             title: '累计加班次数', | |
| //             key: 'overTimeCount', | |
| //          }, { | |
| //             title: '累计加班总时长 / h', | |
| //             key: 'overTimeDuration', | |
| //          },]) | |
| //       } | |
| //       if (optionKeys.includes('vacateStatistic')) { | |
| //          header = header.concat([{ | |
| //             title: '累计请假次数', | |
| //             key: 'vacateCount', | |
| //          }, { | |
| //             title: '累计请假总时长 / h', | |
| //             key: 'vacateDuration', | |
| //          },]) | |
| //       } | |
|  | |
| //       // 查询累计加班次数及总时长 | |
| //       const statisticOvertimeRes = await clickHouse.hr.query(` | |
| //             SELECT  | |
| //                pep_user_id AS pepUserId, | |
| //                count(id) AS count,   | |
| //                sum(duration) AS duration | |
| //             FROM  | |
| //                overtime | |
| //             WHERE pep_user_id IN (${pepUserIds.join(',')}) | |
| //             GROUP BY pep_user_id | |
| //          `).toPromise() | |
|  | |
| //       const statisticVacateRes = await clickHouse.hr.query(` | |
| //             SELECT  | |
| //                pep_user_id AS pepUserId, | |
| //                count(id) AS count, | |
| //                sum(duration) AS duration | |
| //             FROM  | |
| //                vacate | |
| //             WHERE pep_user_id IN (${pepUserIds.join(',')}) | |
| //             GROUP BY pep_user_id | |
| //          `).toPromise() | |
|  | |
| //       exportD.forEach(d => { | |
| //          d.departmrnt = d.departmrnt.map(dep => dep.name).join('、') | |
| //          d.role = d.role.map(r => r.name).join('、') | |
|  | |
| //          d.idPhoto ? d.idPhoto = qiniu.domain + '/' + d.idPhoto : '' | |
| //          d.vitae ? d.vitae = qiniu.domain + '/' + d.vitae : '' | |
|  | |
| //          const corOverTime = statisticOvertimeRes.find(so => so.pepUserId == d.pepUserId) | |
| //          d.overTimeCount = corOverTime ? corOverTime.count : 0 | |
| //          d.overTimeDuration = corOverTime ? (corOverTime.duration / 3600).toFixed(1) : 0 | |
| //          const corVacate = statisticVacateRes.find(so => so.pepUserId == d.pepUserId) | |
| //          d.vacateCount = corVacate ? corVacate.count : 0 | |
| //          d.vacateDuration = corVacate ? (corVacate.duration / 3600).toFixed(1) : 0 | |
| //       }) | |
|  | |
| //       const fileName = `人员信息_${moment().format('YYYYMMDDHHmmss')}` + '.csv' | |
| //       const filePath = await simpleExcelDown({ data: exportD, header, fileName: fileName }) | |
| //       const fileData = fs.readFileSync(filePath); | |
|  | |
| //       ctx.status = 200; | |
| //       ctx.set('Content-Type', 'application/x-xls'); | |
| //       ctx.set('Content-disposition', 'attachment; filename=' + encodeURI(fileName)); | |
| //       ctx.body = fileData; | |
| //    } catch (error) { | |
| //       ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); | |
| //       ctx.status = 400; | |
| //       ctx.body = { | |
| //          message: typeof error == 'string' ? error : undefined | |
| //       } | |
| //    } | |
| // } | |
|  | |
| async function addSalesMemberBulk(ctx) { | |
|    let errorMsg = { message: '导入销售人员信息失败' }; | |
|    const transaction = await ctx.fs.dc.orm.transaction(); | |
|    try { | |
|       const models = ctx.fs.dc.models; | |
|       const data = ctx.request.body; | |
|       let addArr = []; | |
|       let editArr = []; | |
|       let list = await models.SalesDistribution.findAll({ | |
|          attributes: ['pepUserId'] | |
|       }); | |
|       data.map(d => { | |
|          let exist = list.find(m => m.pepUserId == d.pepUserId);//项企的人员编号字段还没有 | |
|          if (exist) { | |
|             editArr.push(d); | |
|          } else { | |
|             addArr.push(d); | |
|          } | |
|       }) | |
| 
 | |
|       //处理新增的 | |
|       if (addArr.length) { | |
|          await models.SalesDistribution.bulkCreate(addArr); | |
|       } | |
| 
 | |
|       //处理编辑的 | |
|       if (editArr.length) { | |
|          for (let i in editArr) { | |
|             let { pepUserId, provinces, cities, businessLines, del = false } = editArr[i]; | |
| 
 | |
|             let dataToUpdate = { | |
|                provinces, | |
|                cities, | |
|                businessLines, | |
|                del | |
|             } | |
|             await models.SalesDistribution.update(dataToUpdate, { where: { pepUserId: pepUserId } }); | |
|          } | |
|       } | |
|       await transaction.commit(); | |
|       ctx.status = 204; | |
|    } catch (error) { | |
|       await transaction.rollback(); | |
|       ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); | |
|       ctx.status = 400; | |
|       ctx.body = errorMsg; | |
|    } | |
| } | |
| 
 | |
| module.exports = { | |
|    salesList, | |
|    add, | |
|    edit, | |
|    del, | |
|    //exportData, | |
|    addSalesMemberBulk, | |
| } |