RelatedSalaryAccounting.php 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use \think\Request;
  5. use \think\Db;
  6. /**
  7. * 关联工资核算接口
  8. */
  9. class RelatedSalaryAccounting extends Api
  10. {
  11. protected $noNeedLogin = ['*'];
  12. protected $noNeedRight = ['*'];
  13. /**
  14. * 首页
  15. *
  16. */
  17. public function index()
  18. {
  19. $this->success('请求成功');
  20. }
  21. /**
  22. * 关联工资核算侧边栏
  23. * @ApiMethod (GET)
  24. */
  25. public function getTab()
  26. {
  27. //get请求
  28. if(!$this->request->isGet()){
  29. $this->error('请求方式错误');
  30. }
  31. $rows = db('人事_关联工资设置')->alias('g')
  32. ->join('人事_基本资料 j', 'g.关联员工 = j.员工编号')
  33. ->field('DATE_FORMAT(g.日期,"%Y%m") as 日期, trim(j.所在部门) as 所在部门,j.部门编码')
  34. ->group('DATE_FORMAT(g.日期,"%Y%m"), j.所在部门')
  35. ->buildSql();
  36. $rows = db()->table($rows . ' t')
  37. ->field('t.日期, t.所在部门')
  38. ->group('t.日期, t.所在部门')
  39. ->order('t.日期 desc, t.部门编码 asc')
  40. ->select();
  41. $result = [];
  42. foreach ($rows as $row) {
  43. $date = $row['日期'];
  44. $department = $row['所在部门'];
  45. if (!isset($result[$date])) {
  46. $result[$date] = [
  47. 'label' => $date,
  48. 'children' => [],
  49. ];
  50. }
  51. $result[$date]['children'][] = [
  52. 'label' => $department,
  53. 'rq' => $date,
  54. ];
  55. }
  56. $result = array_values($result);
  57. $this->success('成功',$result);
  58. }
  59. /**
  60. * 关联工资核算上侧列表
  61. * @ApiMethod (GET)
  62. * @param string $date 年月
  63. * @param string $department 部门
  64. */
  65. public function getList()
  66. {
  67. //get请求
  68. if(!$this->request->isGet()){
  69. $this->error('请求方式错误');
  70. }
  71. $req = $this->request->param();
  72. $year = substr($req['date'],0,4);
  73. $month = substr($req['date'],-2);
  74. $start_time = $year . '-' . $month . '-01 00:00:00';
  75. $end_time = date('Y-m-t', strtotime("$year-$month-01")) . ' 23:59:59';
  76. $gz = db('人事_关联工资设置')->alias('r')
  77. ->join('绩效工资汇总 j', 'r.被关联员工 = j.bh AND r.日期 = j.sczl_rq')
  78. ->join('人事_基本资料 n', 'n.员工编号 = r.关联员工')
  79. ->where('r.日期', 'between', [$start_time, $end_time])
  80. ->where('n.所在部门', $req['department'])
  81. ->group('LEFT(j.sczl_rq, 10), j.bh , r.关联员工')
  82. ->column('CONCAT(j.bh, "-", DATE_FORMAT(j.sczl_rq,"%Y.%m.%d"),"-",r.关联员工) AS rq_bh,r.关联员工, j.bh, sum(j.个人计件工资) as 个人计件工资, sum(j.个人加班工资) as 个人加班工资,
  83. sum(j.异常停机工时) as 异常停机工时, DATE_FORMAT(j.sczl_rq,"%Y.%m.%d") as 日期');
  84. // $arr = [];
  85. // $columns = ['wgjs_bh1', 'wgjs_bh2', 'wgjs_bh3', 'wgjs_bh4', 'wgjs_bh5', 'wgjs_bh6'];
  86. // for ($i = 1; $i <= 6; $i++) {
  87. // $column = $columns[$i-1];
  88. // $r = db('db_wgjs')
  89. // ->field("DATE_FORMAT(wgjs_rq,'%Y.%m.%d') as wgjs_rq, $column as wgjs_bh, 人事_关联工资设置.关联员工, wgjs_js$i as wgjs_js, wgjs_冲定额$i as wgjs_冲定额")
  90. // ->join('人事_关联工资设置', "人事_关联工资设置.被关联员工=db_wgjs.$column and 人事_关联工资设置.日期 = db_wgjs.wgjs_rq")
  91. // ->join('人事_基本资料', "人事_基本资料.员工编号=人事_关联工资设置.关联员工")
  92. // ->where(['人事_关联工资设置.日期' => ['between', "$start_time,$end_time"], '人事_基本资料.所在部门' => $req['department']])
  93. // ->group('wgjs_rq,人事_关联工资设置.关联员工,wgjs_bh')
  94. // ->select();
  95. // $arr = array_merge($arr, $r);
  96. // }
  97. $unionQueries = [];
  98. $columns = ['wgjs_bh1', 'wgjs_bh2', 'wgjs_bh3', 'wgjs_bh4', 'wgjs_bh5', 'wgjs_bh6'];
  99. foreach ($columns as $index => $column) {
  100. $i = $index + 1;
  101. $query = db('db_wgjs')
  102. ->field("
  103. DATE_FORMAT(wgjs_rq,'%Y.%m.%d') as wgjs_rq,
  104. $column as wgjs_bh,
  105. 人事_关联工资设置.关联员工,
  106. wgjs_js{$i} as wgjs_js,
  107. wgjs_冲定额{$i} as wgjs_冲定额
  108. ")
  109. ->join('人事_关联工资设置', "人事_关联工资设置.被关联员工 = db_wgjs.{$column} and 人事_关联工资设置.日期 = db_wgjs.wgjs_rq")
  110. ->join('人事_基本资料', "人事_基本资料.员工编号 = 人事_关联工资设置.关联员工")
  111. ->where([
  112. '人事_关联工资设置.日期' => ['between', "$start_time,$end_time"],
  113. '人事_基本资料.所在部门' => $req['department']
  114. ])
  115. ->group('wgjs_rq, 人事_关联工资设置.关联员工, wgjs_bh')
  116. ->buildSql();
  117. $unionQueries[] = $query;
  118. }
  119. $sql = implode(' UNION ALL ', $unionQueries);
  120. $arr = db()->query($sql);
  121. //wgjs员工每日时长统计
  122. $list = [];
  123. foreach($arr as $v){
  124. if(isset($list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']])){
  125. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']]['异常停机工时']+=$v['wgjs_js'];
  126. }else{
  127. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']]['关联员工']=$v['关联员工'];
  128. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']]['bh']=$v['wgjs_bh'];
  129. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']]['个人计件工资']=0;
  130. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']]['个人加班工资']=0;
  131. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']]['异常停机工时']=$v['wgjs_js'];
  132. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']]['日期']=$v['wgjs_rq'];
  133. }
  134. };
  135. //wgjs员工冲定额时长统计
  136. $list1 = [];
  137. foreach($arr as $v){
  138. if(isset($list1[$v['wgjs_bh'].'-'.$v['关联员工']])){
  139. if($v['wgjs_冲定额']=='是'){
  140. $list1[$v['wgjs_bh'].'-'.$v['关联员工']] += $v['wgjs_js'];
  141. }
  142. }else{
  143. if($v['wgjs_冲定额']=='是'){
  144. $list1[$v['wgjs_bh'].'-'.$v['关联员工']] = $v['wgjs_js'];
  145. }else{
  146. $list1[$v['wgjs_bh'].'-'.$v['关联员工']] = 0;
  147. }
  148. }
  149. };
  150. //获取每个员工计时补差天数
  151. $arr1 = db('绩效工资汇总')->alias('j')
  152. ->field('j.bh,j.sczl_rq')
  153. ->join('人事_基本资料 r','r.员工编号=j.bh')
  154. ->group('j.bh,j.sczl_rq')
  155. ->where('j.sys_ny',$req['date'])
  156. // ->where('j.达标定额','<>',0)
  157. ->where(['r.所在部门'=>['like',$req['department'].'%']])
  158. ->buildSql();
  159. $arr1 = db()->table($arr1 . ' t')
  160. ->group('t.bh, LEFT(t.sczl_rq, 7)')
  161. ->column('t.bh,count(LEFT(t.sczl_rq, 7)) as num');
  162. //查询该员工当月停机工时
  163. $res1=db('绩效工资汇总')
  164. ->join('人事_基本资料','人事_基本资料.员工编号=绩效工资汇总.bh')
  165. ->group('绩效工资汇总.bh,LEFT(sczl_rq, 7)')
  166. ->where('sys_ny',$req['date'])
  167. ->where(['人事_基本资料.所在部门'=>['like',$req['department'].'%']])
  168. ->column('bh, sum(异常停机工时) as 计时时数');
  169. //查询每条记录
  170. $arr2 = db('绩效工资汇总')->alias('j')
  171. ->field('j.bh, DATE_FORMAT(j.sczl_rq,"%Y.%m.%d") as sczl_rq,
  172. sum(j.达标定额) as 达标定额, j.Rate, j.千件工价, sum(j.异常停机工时) as 异常停机工时')
  173. ->join('人事_基本资料 r','r.员工编号=j.bh')
  174. ->where('j.sys_ny',$req['date'])
  175. // ->where('j.达标定额','<>',0)
  176. ->where(['r.所在部门'=>['like',$req['department'].'%']])
  177. ->group('j.bh,j.sczl_rq,j.sczl_gdbh')
  178. ->select();
  179. //计算每条记录的计时补差
  180. $brr = [];
  181. foreach($arr2 as $v){
  182. $yjsss1 = array_key_exists($v['bh'],$list1) ? $list1[$v['bh']] : 0;
  183. $yjsss2 = array_key_exists($v['bh'],$res1) ? $res1[$v['bh']] : 0;
  184. $yjsss = $yjsss1 + $yjsss2;
  185. $a = $yjsss/$arr1[$v['bh']]/11*0.6*$v['达标定额']*$v['Rate']*0.5/1000*$v['千件工价'];
  186. if(array_key_exists($v['bh'].'-'.$v['sczl_rq'],$brr)){
  187. $brr[$v['bh'].'-'.$v['sczl_rq']] += $a;
  188. }else{
  189. $brr[$v['bh'].'-'.$v['sczl_rq']] = $a;
  190. }
  191. }
  192. $data = [];
  193. foreach($gz as $v){
  194. if (!isset($data[$v['关联员工']][$v['日期']])) {
  195. $data[$v['关联员工']][$v['日期']] = [
  196. '个人计件工资' => 0,
  197. '个人加班工资' => 0,
  198. '定额补差' => 0,
  199. '计时工资' => 0
  200. ];
  201. }
  202. $data[$v['关联员工']][$v['日期']]['个人计件工资'] += (float) $v['个人计件工资'];
  203. $data[$v['关联员工']][$v['日期']]['个人加班工资'] += (float) $v['个人加班工资'];
  204. $data[$v['关联员工']][$v['日期']]['定额补差'] += array_key_exists($v['bh'].'-'.$v['日期'],$brr) ? floatval(number_format($brr[$v['bh'].'-'.$v['日期']],2, '.', '')) : 0;
  205. if(array_key_exists($v['bh'].'-'.$v['日期'].'-'.$v['关联员工'],$list)){
  206. $data[$v['关联员工']][$v['日期']]['计时工资'] += floatval(number_format(($v['异常停机工时'] + $list[$v['bh'].'-'.$v['日期'].'-'.$v['关联员工']]['异常停机工时'])*9.5,2, '.', ''));
  207. unset($list[$v['bh'].'-'.$v['日期']]);
  208. }else{
  209. $data[$v['关联员工']][$v['日期']]['计时工资'] += floatval(number_format($v['异常停机工时']*9.5,2, '.', ''));
  210. }
  211. }
  212. foreach($list as $v){
  213. if(array_key_exists($v['关联员工'],$data) && array_key_exists($v['日期'],$data[$v['关联员工']])){
  214. $data[$v['关联员工']][$v['日期']]['计时工资'] += floatval(number_format($v['异常停机工时']*9.5,2, '.', ''));
  215. }else{
  216. $data[$v['关联员工']][$v['日期']]['个人计件工资'] = 0;
  217. $data[$v['关联员工']][$v['日期']]['个人加班工资'] = 0;
  218. $data[$v['关联员工']][$v['日期']]['定额补差'] = 0;
  219. $data[$v['关联员工']][$v['日期']]['计时工资'] = floatval(number_format($v['异常停机工时']*9.5,2, '.', ''));
  220. }
  221. }
  222. $res=db('人事_关联工资设置')
  223. ->join('人事_基本资料','人事_基本资料.员工编号=人事_关联工资设置.关联员工','LEFT')
  224. ->field('关联员工 as 员工编号,rtrim(人事_基本资料.员工姓名) as 员工姓名,rtrim(人事_基本资料.职称职务) as 职称职务,
  225. rtrim(人事_基本资料.所在部门) as 所在部门,DATE_FORMAT(日期,"%Y.%m.%d") as 日期,关联系数,count(被关联员工) as 关联人数')
  226. ->group('LEFT(日期, 10),关联员工')
  227. ->where(['日期'=>['between',"$start_time,$end_time"],'人事_基本资料.所在部门'=>['like',$req['department'].'%']])
  228. ->order('关联员工,日期')
  229. ->select();
  230. foreach($res as $k=>&$v){
  231. if(isset($data[$v['员工编号']][$v['日期']])){
  232. $v['关联计件工资'] = floatval(number_format($data[$v['员工编号']][$v['日期']]['个人计件工资']/$v['关联人数']*$v['关联系数'],2, '.', ''));
  233. $v['关联加班工资'] = floatval(number_format($data[$v['员工编号']][$v['日期']]['个人加班工资']/$v['关联人数']*$v['关联系数'],2, '.', ''));
  234. $v['关联定额补差'] = floatval(number_format($data[$v['员工编号']][$v['日期']]['定额补差']/$v['关联人数']*$v['关联系数'],2, '.', ''));
  235. $v['关联计时工资'] = floatval(number_format($data[$v['员工编号']][$v['日期']]['计时工资']/$v['关联人数']*$v['关联系数'],2, '.', ''));
  236. $v['关联工资合计'] = floatval(number_format(
  237. ($data[$v['员工编号']][$v['日期']]['个人计件工资'] +
  238. $data[$v['员工编号']][$v['日期']]['个人加班工资'] +
  239. $data[$v['员工编号']][$v['日期']]['定额补差'] +
  240. $data[$v['员工编号']][$v['日期']]['计时工资']
  241. )/$v['关联人数']*$v['关联系数'],2, '.', ''));
  242. }else{
  243. unset($res[$k]);
  244. }
  245. }
  246. $res = array_values($res);
  247. if($res===false){
  248. $this->error('失败');
  249. }
  250. $this->success('成功',$res);
  251. }
  252. /**
  253. * 关联工资核算下侧列表
  254. * @ApiMethod (GET)
  255. * @param string $date 年月
  256. * @param string $code 员工编号
  257. */
  258. public function getAllList()
  259. {
  260. //get请求
  261. if(!$this->request->isGet()){
  262. $this->error('请求方式错误');
  263. }
  264. $req = $this->request->param();
  265. $year=substr($req['date'],0,4);
  266. $month=substr($req['date'],-2);
  267. $start_time = $year . '-' . $month . '-01 00:00:00';
  268. $end_time = date('Y-m-t', strtotime("$year-$month-01")) . ' 23:59:59';
  269. $gz = db('人事_关联工资设置')->alias('r')
  270. ->join('绩效工资汇总 j', 'r.被关联员工 = j.bh AND r.日期 = j.sczl_rq')
  271. ->join('人事_基本资料 n', 'n.员工编号 = r.关联员工')
  272. ->where('r.日期', 'between', [$start_time, $end_time])
  273. ->where('r.关联员工', $req['code'])
  274. ->group('LEFT(j.sczl_rq, 10), j.bh')
  275. ->column('CONCAT(j.bh, "-", DATE_FORMAT(j.sczl_rq,"%Y.%m.%d")) AS rq_bh,r.关联员工,r.被关联员工, j.bh,rtrim(j.xm) as 姓名, sum(j.个人计件工资) as 个人计件工资, sum(j.个人加班工资) as 个人加班工资,
  276. sum(j.异常停机工时) as 异常停机工时, DATE_FORMAT(j.sczl_rq,"%Y.%m.%d") as 日期');
  277. $arr = [];
  278. $columns = ['wgjs_bh1', 'wgjs_bh2', 'wgjs_bh3', 'wgjs_bh4', 'wgjs_bh5', 'wgjs_bh6'];
  279. for ($i = 1; $i <= 6; $i++) {
  280. $column = $columns[$i-1];
  281. $r = db('db_wgjs')
  282. ->field("DATE_FORMAT(wgjs_rq,'%Y.%m.%d') as wgjs_rq, $column as wgjs_bh, 人事_关联工资设置.关联员工, trim(人事_基本资料.员工姓名) as 姓名, wgjs_js$i as wgjs_js, wgjs_冲定额$i as wgjs_冲定额")
  283. ->join('人事_关联工资设置', "人事_关联工资设置.被关联员工=db_wgjs.$column and 人事_关联工资设置.日期 = db_wgjs.wgjs_rq")
  284. ->join('人事_基本资料', "人事_基本资料.员工编号=db_wgjs.$column")
  285. ->where(['人事_关联工资设置.日期' => ['between', "$start_time,$end_time"], '人事_关联工资设置.关联员工' => $req['code']])
  286. ->select();
  287. $arr = array_merge($arr, $r);
  288. }
  289. //wgjs员工每日时长统计
  290. $list = [];
  291. foreach($arr as $v){
  292. if(isset($list[$v['wgjs_bh'].'-'.$v['wgjs_rq']])){
  293. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq']]['异常停机工时']+=$v['wgjs_js'];
  294. }else{
  295. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq']]['关联员工']=$v['关联员工'];
  296. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq']]['姓名']=$v['姓名'];
  297. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq']]['bh']=$v['wgjs_bh'];
  298. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq']]['个人计件工资']=0;
  299. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq']]['个人加班工资']=0;
  300. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq']]['异常停机工时']=$v['wgjs_js'];
  301. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq']]['日期']=$v['wgjs_rq'];
  302. }
  303. };
  304. //wgjs员工冲定额时长统计
  305. $list1 = [];
  306. foreach($arr as $v){
  307. if(isset($list1[$v['wgjs_bh']])){
  308. if($v['wgjs_冲定额']=='是'){
  309. $list1[$v['wgjs_bh']] += $v['wgjs_js'];
  310. }
  311. }else{
  312. if($v['wgjs_冲定额']=='是'){
  313. $list1[$v['wgjs_bh']] = $v['wgjs_js'];
  314. }else{
  315. $list1[$v['wgjs_bh']] = 0;
  316. }
  317. }
  318. };
  319. //查询该员工所在部门
  320. $department = db('人事_基本资料')
  321. ->where('员工编号',$req['code'])
  322. ->value('trim(所在部门)');
  323. //获取每个员工计时补差天数
  324. $arr1 = db('绩效工资汇总')->alias('j')
  325. ->field('j.bh,j.sczl_rq')
  326. ->join('人事_基本资料 r','r.员工编号=j.bh')
  327. ->group('j.bh,j.sczl_rq')
  328. ->where('j.sys_ny',$req['date'])
  329. // ->where('j.达标定额','<>',0)
  330. ->where(['r.所在部门'=>$department])
  331. ->buildSql();
  332. $arr1 = db()->table($arr1 . ' t')
  333. ->group('t.bh, LEFT(t.sczl_rq, 7)')
  334. ->column('t.bh,count(LEFT(t.sczl_rq, 7)) as num');
  335. //查询该员工当月停机工时
  336. $res1=db('绩效工资汇总')
  337. ->join('人事_基本资料','人事_基本资料.员工编号=绩效工资汇总.bh')
  338. ->group('绩效工资汇总.bh,LEFT(sczl_rq, 7)')
  339. ->where('sys_ny',$req['date'])
  340. ->where(['人事_基本资料.所在部门'=>$department])
  341. ->column('bh, sum(异常停机工时) as 计时时数');
  342. //查询每条记录
  343. $arr2 = db('绩效工资汇总')->alias('j')
  344. ->field('j.bh, DATE_FORMAT(j.sczl_rq,"%Y.%m.%d") as sczl_rq,
  345. sum(j.达标定额) as 达标定额, j.Rate, j.千件工价, sum(j.异常停机工时) as 异常停机工时')
  346. ->join('人事_基本资料 r','r.员工编号=j.bh')
  347. ->where('j.sys_ny',$req['date'])
  348. // ->where('j.达标定额','<>',0)
  349. ->where(['r.所在部门'=>$department])
  350. ->group('j.bh,j.sczl_rq,j.sczl_gdbh')
  351. ->select();
  352. //计算每条记录的计时补差
  353. $brr = [];
  354. foreach($arr2 as $v){
  355. $yjsss1 = array_key_exists($v['bh'],$list1) ? $list1[$v['bh']] : 0;
  356. $yjsss2 = array_key_exists($v['bh'],$res1) ? $res1[$v['bh']] : 0;
  357. $yjsss = $yjsss1 + $yjsss2;
  358. $a = $yjsss/$arr1[$v['bh']]/11*0.6*$v['达标定额']*$v['Rate']*0.5/1000*$v['千件工价'];
  359. if(array_key_exists($v['bh'].'-'.$v['sczl_rq'],$brr)){
  360. $brr[$v['bh'].'-'.$v['sczl_rq']] += $a;
  361. }else{
  362. $brr[$v['bh'].'-'.$v['sczl_rq']] = $a;
  363. }
  364. }
  365. $data = [];
  366. foreach($gz as $v){
  367. $data[$v['被关联员工']][$v['日期']]['个人计件工资'] = (float) $v['个人计件工资'];
  368. $data[$v['被关联员工']][$v['日期']]['个人加班工资'] = (float) $v['个人加班工资'];
  369. $data[$v['被关联员工']][$v['日期']]['姓名'] = $v['姓名'];
  370. $data[$v['被关联员工']][$v['日期']]['定额补差'] = array_key_exists($v['bh'].'-'.$v['日期'],$brr) ? floatval(number_format($brr[$v['bh'].'-'.$v['日期']],2, '.', '')) : 0;
  371. if(array_key_exists($v['bh'].'-'.$v['日期'],$list)){
  372. $data[$v['被关联员工']][$v['日期']]['计时工资'] = floatval(number_format(($v['异常停机工时'] + $list[$v['bh'].'-'.$v['日期']]['异常停机工时'])*9.5,2, '.', ''));
  373. unset($list[$v['bh'].'-'.$v['日期']]);
  374. }else{
  375. $data[$v['被关联员工']][$v['日期']]['计时工资'] = floatval(number_format($v['异常停机工时']*9.5,2, '.', ''));
  376. }
  377. }
  378. foreach($list as $v){
  379. if(array_key_exists($v['bh'],$data) && array_key_exists($v['日期'],$data[$v['bh']])){
  380. $data[$v['bh']][$v['日期']]['计时工资'] += floatval(number_format($v['异常停机工时']*9.5,2, '.', ''));
  381. }else{
  382. $data[$v['bh']][$v['日期']]['姓名'] = $v['姓名'];
  383. $data[$v['bh']][$v['日期']]['个人计件工资'] = 0;
  384. $data[$v['bh']][$v['日期']]['个人加班工资'] = 0;
  385. $data[$v['bh']][$v['日期']]['定额补差'] = 0;
  386. $data[$v['bh']][$v['日期']]['计时工资'] = floatval(number_format($v['异常停机工时']*9.5,2, '.', ''));
  387. }
  388. }
  389. $res=db('人事_关联工资设置')
  390. ->join('人事_基本资料','人事_基本资料.员工编号=人事_关联工资设置.关联员工','LEFT')
  391. ->field('DATE_FORMAT(日期,"%Y.%m.%d") as 日期,关联员工 as 员工编号,rtrim(人事_基本资料.员工姓名) as 员工姓名,
  392. rtrim(人事_基本资料.职称职务) as 职称职务,rtrim(人事_基本资料.所在部门) as 所在部门,被关联员工,权重')
  393. ->group('LEFT(日期, 10),被关联员工')
  394. ->where(['日期'=>['between',"$start_time,$end_time"],'关联员工'=>$req['code']])
  395. ->order('关联员工,日期,被关联员工')
  396. ->select();
  397. foreach($res as $k=>&$v){
  398. if(isset($data[$v['被关联员工']][$v['日期']])){
  399. $v['被关联姓名']=$data[$v['被关联员工']][$v['日期']]['姓名'];
  400. $v['计件工资']=$data[$v['被关联员工']][$v['日期']]['个人计件工资'];
  401. $v['加班工资']=$data[$v['被关联员工']][$v['日期']]['个人加班工资'];
  402. $v['定额补差']=$data[$v['被关联员工']][$v['日期']]['定额补差'];
  403. $v['计时工资']=$data[$v['被关联员工']][$v['日期']]['计时工资'];
  404. }else{
  405. unset($res[$k]);
  406. }
  407. }
  408. $res = array_values($res);
  409. $this->success('成功',$res);
  410. }
  411. /**
  412. * 关联工资核算详情
  413. * @ApiMethod (GET)
  414. * @param string $date 日期
  415. * @param string $code 员工编号
  416. */
  417. public function getDetail()
  418. {
  419. //get请求
  420. if(!$this->request->isGet()){
  421. $this->error('请求方式错误');
  422. }
  423. $req = $this->request->param();
  424. $start_time=$req['date'].' 00:00:00';
  425. $end_time=$req['date'].' 23:59:59';
  426. $gz=db('绩效工资汇总')
  427. ->field('bh,rtrim(xm) as 姓名,sum(个人计件工资) as 个人计件工资,sum(个人加班工资) as 个人加班工资,
  428. DATE_FORMAT(sczl_rq,"%Y.%m.%d") as sczl_rq')
  429. ->group('LEFT(sczl_rq, 10),bh')
  430. ->where(['sczl_rq'=>$start_time])
  431. ->select();
  432. foreach($gz as $v){
  433. $data[$v['bh']][$v['sczl_rq']]=$v;
  434. }
  435. $res=db('人事_关联工资设置')
  436. ->join('人事_基本资料','人事_基本资料.员工编号=人事_关联工资设置.关联员工','LEFT')
  437. ->field('DATE_FORMAT(日期,"%Y.%m.%d") as 日期,关联员工 as 员工编号,rtrim(人事_基本资料.员工姓名) as 员工姓名,
  438. rtrim(人事_基本资料.职称职务) as 职称职务,人事_基本资料.所在部门,被关联员工,权重')
  439. ->group('LEFT(日期, 10),被关联员工')
  440. ->where(['日期'=>['between',"$start_time,$end_time"],'关联员工'=>$req['code']])
  441. ->order('关联员工,日期')
  442. ->select();
  443. if(!$res){
  444. $this->error('失败');
  445. }
  446. foreach($res as &$v){
  447. if(isset($data[$v['被关联员工']][$v['日期']])){
  448. $v['被关联姓名']=$data[$v['被关联员工']][$v['日期']]['姓名'];
  449. $v['个人计件工资']=$data[$v['被关联员工']][$v['日期']]['个人计件工资'];
  450. $v['个人加班工资']=$data[$v['被关联员工']][$v['日期']]['个人加班工资'];
  451. }else{
  452. $v['个人计件工资']='';
  453. $v['个人加班工资']='';
  454. }
  455. }
  456. $this->success('成功',$res);
  457. }
  458. /**
  459. * 定位
  460. * @ApiMethod GET
  461. */
  462. public function search(){
  463. //get请求
  464. if(!$this->request->isGet()){
  465. $this->error('请求方式错误');
  466. }
  467. $req = $this->request->param();
  468. $year = substr($req['date'],0,4);
  469. $month = substr($req['date'],-2);
  470. $start_time = $year . '-' . $month . '-01 00:00:00';
  471. $end_time = date('Y-m-t', strtotime("$year-$month-01")) . ' 23:59:59';
  472. $gz = db('人事_关联工资设置')->alias('r')
  473. ->join('绩效工资汇总 j', 'r.被关联员工 = j.bh AND r.日期 = j.sczl_rq')
  474. ->join('人事_基本资料 n', 'n.员工编号 = r.关联员工')
  475. ->where('r.日期', 'between', [$start_time, $end_time])
  476. ->where('n.所在部门', 'like', $req['department'] . '%')
  477. ->where('r.关联员工', 'like', '%' . $req['search'] . '%')
  478. ->group('LEFT(j.sczl_rq, 10), j.bh')
  479. ->column('CONCAT(j.bh, "-", DATE_FORMAT(j.sczl_rq,"%Y.%m.%d"),"-",r.关联员工 ) AS rq_bh,r.关联员工, j.bh, sum(j.个人计件工资) as 个人计件工资, sum(j.个人加班工资) as 个人加班工资,
  480. sum(j.异常停机工时) as 异常停机工时, DATE_FORMAT(j.sczl_rq,"%Y.%m.%d") as 日期');
  481. $arr = [];
  482. $columns = ['wgjs_bh1', 'wgjs_bh2', 'wgjs_bh3', 'wgjs_bh4', 'wgjs_bh5', 'wgjs_bh6'];
  483. for ($i = 1; $i <= 6; $i++) {
  484. $column = $columns[$i-1];
  485. $r = db('db_wgjs')
  486. ->field("DATE_FORMAT(wgjs_rq,'%Y.%m.%d') as wgjs_rq, $column as wgjs_bh, 人事_关联工资设置.关联员工, wgjs_js$i as wgjs_js, wgjs_冲定额$i as wgjs_冲定额")
  487. ->join('人事_关联工资设置', "人事_关联工资设置.被关联员工=db_wgjs.$column and 人事_关联工资设置.日期 = db_wgjs.wgjs_rq")
  488. ->join('人事_基本资料', "人事_基本资料.员工编号=人事_关联工资设置.关联员工")
  489. ->where(['人事_关联工资设置.日期' => ['between', "$start_time,$end_time"], '人事_基本资料.所在部门' => ['like', $req['department'] . '%']])
  490. ->select();
  491. $arr = array_merge($arr, $r);
  492. }
  493. //wgjs员工每日时长统计
  494. $list = [];
  495. foreach($arr as $v){
  496. if(isset($list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']])){
  497. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']]['异常停机工时']+=$v['wgjs_js'];
  498. }else{
  499. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']]['关联员工']=$v['关联员工'];
  500. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']]['bh']=$v['wgjs_bh'];
  501. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']]['个人计件工资']=0;
  502. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']]['个人加班工资']=0;
  503. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']]['异常停机工时']=$v['wgjs_js'];
  504. $list[$v['wgjs_bh'].'-'.$v['wgjs_rq'].'-'.$v['关联员工']]['日期']=$v['wgjs_rq'];
  505. }
  506. };
  507. //wgjs员工冲定额时长统计
  508. $list1 = [];
  509. foreach($arr as $v){
  510. if(isset($list1[$v['wgjs_bh']])){
  511. if($v['wgjs_冲定额']=='是'){
  512. $list1[$v['wgjs_bh']] += $v['wgjs_js'];
  513. }
  514. }else{
  515. if($v['wgjs_冲定额']=='是'){
  516. $list1[$v['wgjs_bh']] = $v['wgjs_js'];
  517. }else{
  518. $list1[$v['wgjs_bh']] = 0;
  519. }
  520. }
  521. };
  522. //获取每个员工计时补差天数
  523. $arr1 = db('绩效工资汇总')->alias('j')
  524. ->field('j.bh,j.sczl_rq')
  525. ->join('人事_基本资料 r','r.员工编号=j.bh')
  526. ->group('j.bh,j.sczl_rq')
  527. ->where('j.sys_ny',$req['date'])
  528. // ->where('j.达标定额','<>',0)
  529. ->where(['r.所在部门'=>['like',$req['department'].'%']])
  530. ->buildSql();
  531. $arr1 = db()->table($arr1 . ' t')
  532. ->group('t.bh, LEFT(t.sczl_rq, 7)')
  533. ->column('t.bh,count(LEFT(t.sczl_rq, 7)) as num');
  534. //查询该员工当月停机工时
  535. $res1=db('绩效工资汇总')
  536. ->join('人事_基本资料','人事_基本资料.员工编号=绩效工资汇总.bh')
  537. ->group('绩效工资汇总.bh,LEFT(sczl_rq, 7)')
  538. ->where('sys_ny',$req['date'])
  539. ->where(['人事_基本资料.所在部门'=>['like',$req['department'].'%']])
  540. ->column('bh, sum(异常停机工时) as 计时时数');
  541. //查询每条记录
  542. $arr2 = db('绩效工资汇总')->alias('j')
  543. ->field('j.bh, DATE_FORMAT(j.sczl_rq,"%Y.%m.%d") as sczl_rq,
  544. sum(j.达标定额) as 达标定额, j.Rate, j.千件工价, sum(j.异常停机工时) as 异常停机工时')
  545. ->join('人事_基本资料 r','r.员工编号=j.bh')
  546. ->where('j.sys_ny',$req['date'])
  547. // ->where('j.达标定额','<>',0)
  548. ->where(['r.所在部门'=>['like',$req['department'].'%']])
  549. ->group('j.bh,j.sczl_rq,j.sczl_gdbh')
  550. ->select();
  551. //计算每条记录的计时补差
  552. $brr = [];
  553. foreach($arr2 as $v){
  554. $yjsss1 = array_key_exists($v['bh'],$list1) ? $list1[$v['bh']] : 0;
  555. $yjsss2 = array_key_exists($v['bh'],$res1) ? $res1[$v['bh']] : 0;
  556. $yjsss = $yjsss1 + $yjsss2;
  557. $a = $yjsss/$arr1[$v['bh']]/11*0.6*$v['达标定额']*$v['Rate']*0.5/1000*$v['千件工价'];
  558. if(array_key_exists($v['bh'].'-'.$v['sczl_rq'],$brr)){
  559. $brr[$v['bh'].'-'.$v['sczl_rq']] += $a;
  560. }else{
  561. $brr[$v['bh'].'-'.$v['sczl_rq']] = $a;
  562. }
  563. }
  564. $data = [];
  565. foreach($gz as $v){
  566. if (!isset($data[$v['关联员工']][$v['日期']])) {
  567. $data[$v['关联员工']][$v['日期']] = [
  568. '个人计件工资' => 0,
  569. '个人加班工资' => 0,
  570. '定额补差' => 0,
  571. '计时工资' => 0
  572. ];
  573. }
  574. $data[$v['关联员工']][$v['日期']]['个人计件工资'] += (float) $v['个人计件工资'];
  575. $data[$v['关联员工']][$v['日期']]['个人加班工资'] += (float) $v['个人加班工资'];
  576. $data[$v['关联员工']][$v['日期']]['定额补差'] += array_key_exists($v['bh'].'-'.$v['日期'],$brr) ? floatval(number_format($brr[$v['bh'].'-'.$v['日期']],2, '.', '')) : 0;
  577. if(array_key_exists($v['bh'].'-'.$v['日期'].'-'.$v['关联员工'],$list)){
  578. $data[$v['关联员工']][$v['日期']]['计时工资'] += floatval(number_format(($v['异常停机工时'] + $list[$v['bh'].'-'.$v['日期'].'-'.$v['关联员工']]['异常停机工时'])*9.5,2, '.', ''));
  579. unset($list[$v['bh'].'-'.$v['日期']]);
  580. }else{
  581. $data[$v['关联员工']][$v['日期']]['计时工资'] += floatval(number_format($v['异常停机工时']*9.5,2, '.', ''));
  582. }
  583. }
  584. foreach($list as $v){
  585. if(array_key_exists($v['关联员工'],$data) && array_key_exists($v['日期'],$data[$v['关联员工']])){
  586. $data[$v['关联员工']][$v['日期']]['计时工资'] += floatval(number_format($v['异常停机工时']*9.5,2, '.', ''));
  587. }else{
  588. $data[$v['关联员工']][$v['日期']]['个人计件工资'] = 0;
  589. $data[$v['关联员工']][$v['日期']]['个人加班工资'] = 0;
  590. $data[$v['关联员工']][$v['日期']]['定额补差'] = 0;
  591. $data[$v['关联员工']][$v['日期']]['计时工资'] = floatval(number_format($v['异常停机工时']*9.5,2, '.', ''));
  592. }
  593. }
  594. $res=db('人事_关联工资设置')
  595. ->join('人事_基本资料','人事_基本资料.员工编号=人事_关联工资设置.关联员工','LEFT')
  596. ->field('关联员工 as 员工编号,rtrim(人事_基本资料.员工姓名) as 员工姓名,rtrim(人事_基本资料.职称职务) as 职称职务,
  597. rtrim(人事_基本资料.所在部门) as 所在部门,DATE_FORMAT(日期,"%Y.%m.%d") as 日期,关联系数,count(被关联员工) as 关联人数')
  598. ->group('LEFT(日期, 10),关联员工')
  599. ->where(['日期'=>['between',"$start_time,$end_time"],'关联员工'=>['like','%' . $req['search'] . '%'],'人事_基本资料.所在部门'=>['like',$req['department'].'%']])
  600. ->order('关联员工,日期')
  601. ->select();
  602. foreach($res as $k=>&$v){
  603. if(isset($data[$v['员工编号']][$v['日期']])){
  604. $v['关联计件工资'] = floatval(number_format($data[$v['员工编号']][$v['日期']]['个人计件工资']/$v['关联人数']*$v['关联系数'],2, '.', ''));
  605. $v['关联加班工资'] = floatval(number_format($data[$v['员工编号']][$v['日期']]['个人加班工资']/$v['关联人数']*$v['关联系数'],2, '.', ''));
  606. $v['关联定额补差'] = floatval(number_format($data[$v['员工编号']][$v['日期']]['定额补差']/$v['关联人数']*$v['关联系数'],2, '.', ''));
  607. $v['关联计时工资'] = floatval(number_format($data[$v['员工编号']][$v['日期']]['计时工资']/$v['关联人数']*$v['关联系数'],2, '.', ''));
  608. $v['关联工资合计'] = floatval(number_format(
  609. ($data[$v['员工编号']][$v['日期']]['个人计件工资'] +
  610. $data[$v['员工编号']][$v['日期']]['个人加班工资'] +
  611. $data[$v['员工编号']][$v['日期']]['定额补差'] +
  612. $data[$v['员工编号']][$v['日期']]['计时工资']
  613. )/$v['关联人数']*$v['关联系数'],2, '.', ''));
  614. }else{
  615. unset($res[$k]);
  616. }
  617. }
  618. $res = array_values($res);
  619. if($res===false){
  620. $this->error('失败');
  621. }
  622. $this->success('成功',$res);
  623. }
  624. /**
  625. * 关联工资设置
  626. * @ApiMethod (GET)
  627. * @param string $date 日期
  628. * @param string $code 员工编号
  629. */
  630. public function setting()
  631. {
  632. //get请求
  633. if(!$this->request->isGet()){
  634. $this->error('请求方式错误');
  635. }
  636. $req = $this->request->param();
  637. $start_time=$req['date'].' 00:00:00';
  638. $end_time=$req['date'].' 23:59:59';
  639. $data=db('绩效工资汇总')
  640. ->group('bh')
  641. ->where(['sczl_rq'=>$start_time])
  642. ->column('bh,rtrim(xm) as 姓名,sum(个人计件工资) as 个人计件工资,
  643. sum(个人加班工资) as 个人加班工资');
  644. $res = db('人事_关联工资设置')->alias('r')
  645. ->join('人事_基本资料 j1','j1.员工编号 = r.关联员工')
  646. ->join('人事_基本资料 j2','j2.员工编号 = r.被关联员工')
  647. ->field('DATE_FORMAT(r.日期,"%Y.%m.%d") as 日期, r.关联员工 as 关联人员工号,
  648. rtrim(j1.员工姓名) as 关联人员姓名, r.被关联员工 as 班组员工编号,rtrim(j2.员工姓名) as 被关联人员姓名,
  649. r.权重 as 组员权重,r.关联系数 as 日关联系数,r.UniqID')
  650. ->where(['r.日期'=>['between',"$start_time,$end_time"],'r.关联员工'=>$req['code']])
  651. ->order('r.关联员工')
  652. ->select();
  653. if($res===false){
  654. $this->error('失败');
  655. }
  656. foreach($res as &$v){
  657. if(isset($data[$v['班组员工编号']])){
  658. $v['计件工资基数'] = $data[$v['班组员工编号']]['个人计件工资'];
  659. $v['加班工资基数'] = $data[$v['班组员工编号']]['个人加班工资'];
  660. }else{
  661. $v['计件工资基数'] = 0;
  662. $v['加班工资基数'] = 0;
  663. }
  664. $v['班组员工编号'] = $v['班组员工编号'].'('.$v['被关联人员姓名'].')';
  665. $v['日关联人数'] = count($res);
  666. }
  667. $this->success('成功',$res);
  668. }
  669. /**
  670. * 更新关联系数
  671. * @ApiMethod (GET)
  672. * @param string $date 日期
  673. * @param string $code 员工编号
  674. */
  675. public function updateNum()
  676. {
  677. //get请求
  678. if(!$this->request->isGet()){
  679. $this->error('请求方式错误');
  680. }
  681. $req = $this->request->param();
  682. $req['date']=str_replace('.','-',$req['date']);
  683. $start_time=$req['date'].' 00:00:00';
  684. // $sql=db()->table('人事_关联工资设置')
  685. // ->where(['日期'=>$start_time,'关联员工'=>$req['code']])
  686. // ->fetchSql(true)
  687. // ->setField('关联系数',$req['num']);
  688. // Db::query($sql);
  689. $data['mod_rq'] = date('Y-m-d H:i:s');
  690. $data['关联系数']=$req['num'];
  691. //开启事务
  692. db()->startTrans();
  693. try{
  694. $sql = db()->table('人事_关联工资设置')
  695. ->where(['日期'=>$start_time,'关联员工'=>$req['code']])
  696. ->fetchSql(true)
  697. ->update($data);
  698. $res = db()->query($sql);
  699. // 提交事务
  700. db()->commit();
  701. } catch (\Exception $e) {
  702. // 回滚事务
  703. db()->rollback();
  704. $this->error($e->getMessage());
  705. }
  706. if($res===false) $this->error('失败');
  707. $this->success('成功');
  708. }
  709. /**
  710. * 关联组员权重查询
  711. * @ApiMethod (GET)
  712. * @param string $date 日期
  713. * @param string $code 员工编号
  714. */
  715. public function weightDetail()
  716. {
  717. //get请求
  718. if(!$this->request->isGet()){
  719. $this->error('请求方式错误');
  720. }
  721. $req = $this->request->param();
  722. $req['date']=str_replace('.','-',$req['date']);
  723. $start_time=$req['date'].' 00:00:00';
  724. $end_time=$req['date'].' 23:59:59';
  725. $res=db('人事_基本资料')
  726. ->join('人事_关联工资设置','人事_基本资料.员工编号=人事_关联工资设置.被关联员工','LEFT')
  727. ->join('人事_员工照片','人事_基本资料.照片ID=人事_员工照片.UniqId','LEFT')
  728. ->field('人事_关联工资设置.被关联员工 as 员工编号,rtrim(员工姓名) as 姓名,rtrim(所在部门) as 部门名称,人事_基本资料.职称职务 as 职务,
  729. DATE_FORMAT(聘用日期,"%Y.%m.%d") as 入职日期,权重 as 关联权重')
  730. ->group('被关联员工')
  731. ->where(['人事_关联工资设置.日期'=>['between',"$start_time,$end_time"],'人事_关联工资设置.被关联员工'=>$req['code']])
  732. ->order('关联员工,日期')
  733. ->select();
  734. if(!$res){
  735. $this->error('失败');
  736. }
  737. $this->success('成功',$res);
  738. }
  739. /**
  740. * 批量附加组员列表
  741. * @ApiMethod (GET)
  742. * @param string $date 日期
  743. * @param string $code 员工编号
  744. */
  745. public function batchAddLst()
  746. {
  747. //get请求
  748. if(!$this->request->isGet()){
  749. $this->error('请求方式错误');
  750. }
  751. $req = $this->request->param();
  752. $req['date']=str_replace('.','-',$req['date']);
  753. $start_time=$req['date'].' 00:00:00';
  754. $end_time=$req['date'].' 23:59:59';
  755. $res=db('绩效工资汇总')->alias('j')
  756. ->join('人事_基本资料 r','r.员工编号=j.bh')
  757. ->field('DATE_FORMAT(j.sczl_rq,"%Y.%m.%d") as 日期,
  758. trim(r.所在部门) as 所在部门,sczl_bzdh, trim(r.职称职务) as 职称职务,
  759. CONCAT(trim(j.xm),"(", j.bh, ")") as 班组员工编号,
  760. sum(j.个人计件工资) as 个人计件工资, sum(j.个人加班工资) as 个人加班工资,
  761. j.bh, j.UniqID')
  762. ->group('j.bh')
  763. ->where(['j.sczl_rq'=>['between',"$start_time,$end_time"]])
  764. ->order('r.所在部门,r.所在部门,j.bh')
  765. ->select();
  766. if($res===false){
  767. $this->error('失败');
  768. }
  769. $this->success('成功',$res);
  770. }
  771. /**
  772. * 批量附加组员定位
  773. * @ApiMethod (GET)
  774. * @param string $date 日期
  775. * @param string $search 员工编号
  776. */
  777. public function batchAddSearch()
  778. {
  779. //get请求
  780. if(!$this->request->isGet()){
  781. $this->error('请求方式错误');
  782. }
  783. $req = $this->request->param();
  784. $req['date']=str_replace('.','-',$req['date']);
  785. $start_time=$req['date'].' 00:00:00';
  786. $end_time=$req['date'].' 23:59:59';
  787. $gd = db('人事_基本资料')->where('员工姓名','like','%'.$req['search'].'%')->whereOr('pycode',$req['search'])->column('员工编号');
  788. if($gd){
  789. $where = [
  790. 'j.sczl_rq'=>['between',"$start_time,$end_time"],
  791. 'j.bh'=>['in',$gd]
  792. ];
  793. }else{
  794. $where = [
  795. 'j.sczl_rq'=>['between',"$start_time,$end_time"],
  796. 'j.bh'=>['like','%'.$req['search'].'%']
  797. ];
  798. }
  799. $res=db('绩效工资汇总')->alias('j')
  800. ->join('人事_基本资料 r','r.员工编号=j.bh')
  801. ->field('DATE_FORMAT(j.sczl_rq,"%Y.%m.%d") as 日期,
  802. trim(r.所在部门) as 所在部门,sczl_bzdh, trim(r.职称职务) as 职称职务,
  803. CONCAT(trim(j.xm),"(", j.bh, ")") as 班组员工编号,
  804. sum(j.个人计件工资) as 个人计件工资, sum(j.个人加班工资) as 个人加班工资,
  805. j.bh, j.UniqID')
  806. ->group('j.bh')
  807. ->where($where)
  808. ->order('r.所在部门,r.所在部门,j.bh')
  809. ->select();
  810. if (empty($res)){
  811. $data = \db('人事_基本资料')
  812. ->whereIn('员工编号',$gd)
  813. ->field('CONCAT(trim(员工姓名),"(", 员工编号, ")") as 班组员工编号,所在部门,职称职务')
  814. ->select();
  815. $res = [];
  816. foreach ($data as $key=>$value) {
  817. $value['日期'] = $req['date'];
  818. $value['个人加班工资'] = 0;
  819. $value['个人计件工资'] = 0;
  820. $value['sczl_bzdh'] = '';
  821. array_push($res,$value);
  822. }
  823. }
  824. if($res===false){
  825. $this->error('失败');
  826. }
  827. $this->success('成功',$res);
  828. }
  829. /**
  830. * 关联组员复制列表
  831. * @ApiMethod (GET)
  832. * @param string $date 日期
  833. */
  834. public function copyLst()
  835. {
  836. //get请求
  837. if(!$this->request->isGet()){
  838. $this->error('请求方式错误');
  839. }
  840. $req = $this->request->param();
  841. $req['date']=str_replace('.','-',$req['date']);
  842. $start_time=$req['date'].' 00:00:00';
  843. $end_time=$req['date'].' 23:59:59';
  844. $res=db('人事_关联工资设置')
  845. ->join('人事_基本资料','人事_基本资料.员工编号=人事_关联工资设置.关联员工','LEFT')
  846. ->field('关联员工 as 员工编号, trim(人事_基本资料.员工姓名) as 员工姓名, trim(人事_基本资料.所在部门) as 所在部门, trim(人事_基本资料.职称职务) as 职称职务,trim(人事_基本资料.UniqID) as UniqID')
  847. ->group('关联员工')
  848. ->where(['日期'=>['between',"$start_time,$end_time"]])
  849. ->select();
  850. if($res===false){
  851. $this->error('失败');
  852. }
  853. $this->success('成功',$res);
  854. }
  855. /**
  856. * 批量附加组员
  857. * @ApiMethod POST
  858. * @params string UniqID
  859. */
  860. public function batchAdd(){
  861. if (Request::instance()->isPost() == false){
  862. $this->error('非法请求');
  863. }
  864. $params = Request::instance()->post();
  865. if (!isset($params) || count($params)==0){
  866. $this->error('参数不能为空');
  867. }
  868. $date = date('Y-m-d H:i:s');
  869. //查询当前最大id
  870. $UniqID = db('人事_关联工资设置')->order('UniqID desc')->limit(1)->value('UniqID');
  871. $i = 1;
  872. $rows = [];
  873. foreach($params as $k=>$v){
  874. //查询当天此关联用户是否已经绑定过此被关联用户
  875. $bool = db('人事_关联工资设置')
  876. ->where(['日期'=>$v['date'].' 00:00:00','关联员工'=>$v['关联员工'],'被关联员工'=>$v['被关联员工']])
  877. ->find();
  878. if($bool) continue;
  879. $rows[$k] = [
  880. 'sys_id' => $v['sys_id'],
  881. '日期' => $v['date'].' 00:00:00',
  882. '关联员工' => $v['关联员工'],
  883. '关联系数' => $v['关联系数'],
  884. '被关联员工' => $v['被关联员工'],
  885. '权重' => 1.00,
  886. 'sys_rq' => $date,
  887. 'UniqID' => $UniqID+$i,
  888. ];
  889. $i++;
  890. }
  891. if(!count($rows)) $this->success('成功');
  892. //开启事务
  893. db()->startTrans();
  894. try{
  895. $sql=db()->table('人事_关联工资设置')
  896. ->fetchSql(true)
  897. ->insertAll($rows);
  898. $res=db()->query($sql);
  899. // 提交事务
  900. db()->commit();
  901. } catch (\Exception $e) {
  902. // 回滚事务
  903. db()->rollback();
  904. $this->error($e->getMessage());
  905. }
  906. if($res===false) $this->error('失败');
  907. $this->success('成功');
  908. }
  909. /**
  910. * 批量删除组员
  911. * @ApiMethod POST
  912. * @params string UniqID
  913. */
  914. public function batchDel(){
  915. if (Request::instance()->isPost() == false){
  916. $this->error('非法请求');
  917. }
  918. $params = Request::instance()->post();
  919. if (!isset($params) || !isset($params[0]['UniqID'])){
  920. $this->error('参数不能为空');
  921. }
  922. //开启事务
  923. db()->startTrans();
  924. try{
  925. foreach($params as $k=>$v){
  926. $sql=db('人事_关联工资设置')
  927. ->where(['UniqID'=>$v['UniqID']])
  928. ->fetchSql(true)
  929. ->delete($v);
  930. $res=db()->query($sql);
  931. }
  932. // 提交事务
  933. db()->commit();
  934. } catch (\Exception $e) {
  935. // 回滚事务
  936. db()->rollback();
  937. $this->error($e->getMessage());
  938. }
  939. if($res===false) $this->error('失败');
  940. $this->success('成功');
  941. }
  942. /**
  943. * 关联组员复制
  944. * @ApiMethod POST
  945. * @params string UniqID
  946. */
  947. public function copy(){
  948. if (Request::instance()->isPost() == false){
  949. $this->error('非法请求');
  950. }
  951. $params = Request::instance()->post();
  952. if (!isset($params) || !isset($params[0])){
  953. $this->error('参数不能为空');
  954. }
  955. //开启事务
  956. db()->startTrans();
  957. try{
  958. foreach($params as $v){
  959. $v['old_time']=str_replace('.','-',$v['old_time']).' 00:00:00';
  960. $v['new_time']=str_replace('.','-',$v['new_time']).' 00:00:00';
  961. db()->table('人事_关联工资设置')
  962. ->where(['关联员工'=>$v['关联员工'],'日期'=>$v['new_time']])
  963. ->delete();
  964. $data=db('人事_关联工资设置')
  965. ->field('关联员工,关联系数,被关联员工,权重')
  966. ->where(['关联员工'=>$v['关联员工'],'日期'=>$v['old_time']])
  967. ->select();
  968. $id=db('人事_关联工资设置')->order('UniqID desc')->limit(1)->value('UniqID');
  969. $i=1;
  970. foreach($data as &$value){
  971. $value['sys_id']=$v['sys_id'];
  972. $value['日期']=$v['new_time'];
  973. $value['UniqID']=$i+$id;
  974. $value['sys_rq']=date('Y-m-d H:i:s');
  975. $i++;
  976. }
  977. $sql=db()->table('人事_关联工资设置')
  978. ->fetchSql(true)
  979. ->insertAll($data);
  980. $res=Db::query($sql);
  981. }
  982. // 提交事务
  983. db()->commit();
  984. } catch (\Exception $e) {
  985. // 回滚事务
  986. db()->rollback();
  987. $this->error($e->getMessage());
  988. }
  989. if($res===false) $this->error('失败');
  990. $this->success('成功');
  991. }
  992. }