Purchase.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. <?php
  2. /**
  3. +-----------------------------------------------------------------------------------------------
  4. * GouGuOPEN [ 左手研发,右手开源,未来可期!]
  5. +-----------------------------------------------------------------------------------------------
  6. * @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
  7. +-----------------------------------------------------------------------------------------------
  8. * @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
  9. +-----------------------------------------------------------------------------------------------
  10. * @Author 勾股工作室 <hdm58@qq.com>
  11. +-----------------------------------------------------------------------------------------------
  12. */
  13. declare (strict_types = 1);
  14. namespace app\contract\controller;
  15. use app\base\BaseController;
  16. use app\contract\model\Purchase as PurchaseModel;
  17. use app\contract\validate\PurchaseValidate;
  18. use think\exception\ValidateException;
  19. use think\facade\Db;
  20. use think\facade\View;
  21. class Purchase extends BaseController
  22. {
  23. /**
  24. * 构造函数
  25. */
  26. protected $model;
  27. public function __construct()
  28. {
  29. parent::__construct(); // 调用父类构造函数
  30. $this->model = new PurchaseModel();
  31. }
  32. /**
  33. * 数据列表
  34. */
  35. public function datalist()
  36. {
  37. $param = get_params();
  38. if (request()->isAjax()) {
  39. $tab = isset($param['tab']) ? $param['tab'] : 0;
  40. $uid = $this->uid;
  41. $where = [];
  42. $whereOr = [];
  43. $where[]=['delete_time','=',0];
  44. $where[]=['archive_time','=',0];
  45. $where[]=['stop_time','=',0];
  46. $where[]=['void_time','=',0];
  47. if (!empty($param['keywords'])) {
  48. $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
  49. }
  50. if (!empty($param['types'])) {
  51. $where[] = ['types', '=',$param['types']];
  52. }
  53. if (!empty($param['cate_id'])) {
  54. $where[] = ['cate_id', '=',$param['cate_id']];
  55. }
  56. if (isset($param['check_status']) && $param['check_status']!='') {
  57. $where[] = ['check_status', '=',$param['check_status']];
  58. }
  59. if (!empty($param['sign_time'])) {
  60. $sign_time =explode('~', $param['sign_time']);
  61. $where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
  62. }
  63. if (!empty($param['end_time'])) {
  64. $end_time =explode('~', $param['end_time']);
  65. $where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
  66. }
  67. if($tab == 0){
  68. if (!empty($param['uid'])) {
  69. $where[] = ['sign_uid', '=', $param['uid']];
  70. }
  71. else{
  72. //是否是合同管理员
  73. $auth = isAuth($uid,'contract_admin','conf_1');
  74. if($auth == 0){
  75. $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
  76. $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
  77. $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
  78. $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
  79. $dids_a = get_leader_departments($uid);
  80. $dids_b = get_role_departments($uid);
  81. $dids = array_merge($dids_a, $dids_b);
  82. if(!empty($dids)){
  83. $whereOr[] = ['did','in',$dids];
  84. }
  85. }
  86. }
  87. }
  88. if($tab == 1){
  89. $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
  90. }
  91. if($tab == 2){
  92. $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
  93. }
  94. $list = $this->model->datalist($param,$where,$whereOr);
  95. return table_assign(0, '', $list);
  96. }
  97. else{
  98. View::assign('is_leader', isLeader($this->uid));
  99. View::assign('is_auth', isAuth($this->uid,'contract_admin','conf_1'));
  100. View::assign('delay_num', valueAuth('contract_admin','conf_10'));
  101. return view();
  102. }
  103. }
  104. public function archivelist()
  105. {
  106. $param = get_params();
  107. if (request()->isAjax()) {
  108. $uid = $this->uid;
  109. $where = [];
  110. $whereOr = [];
  111. $where[]=['delete_time','=',0];
  112. $where[]=['archive_time','>',0];
  113. if (!empty($param['keywords'])) {
  114. $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
  115. }
  116. if (!empty($param['types'])) {
  117. $where[] = ['types', '=',$param['types']];
  118. }
  119. if (!empty($param['cate_id'])) {
  120. $where[] = ['cate_id', '=',$param['cate_id']];
  121. }
  122. if (!empty($param['sign_time'])) {
  123. $sign_time =explode('~', $param['sign_time']);
  124. $where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
  125. }
  126. if (!empty($param['end_time'])) {
  127. $end_time =explode('~', $param['end_time']);
  128. $where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
  129. }
  130. //是否是合同管理员
  131. $auth = isAuth($uid,'contract_admin','conf_1');
  132. if($auth == 0){
  133. $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
  134. $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
  135. $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
  136. $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
  137. $dids_a = get_leader_departments($uid);
  138. $dids_b = get_role_departments($uid);
  139. $dids = array_merge($dids_a, $dids_b);
  140. if(!empty($dids)){
  141. $whereOr[] = ['did','in',$dids];
  142. }
  143. }
  144. $list = $this->model->datalist($param,$where,$whereOr);
  145. return table_assign(0, '', $list);
  146. }
  147. else{
  148. View::assign('delay_num', valueAuth('contract_admin','conf_10'));
  149. return view();
  150. }
  151. }
  152. public function stoplist()
  153. {
  154. $param = get_params();
  155. if (request()->isAjax()) {
  156. $uid = $this->uid;
  157. $where = [];
  158. $whereOr = [];
  159. $where[]=['delete_time','=',0];
  160. $where[]=['stop_time','>',0];
  161. if (!empty($param['keywords'])) {
  162. $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
  163. }
  164. if (!empty($param['types'])) {
  165. $where[] = ['types', '=',$param['types']];
  166. }
  167. if (!empty($param['cate_id'])) {
  168. $where[] = ['cate_id', '=',$param['cate_id']];
  169. }
  170. if (!empty($param['sign_time'])) {
  171. $sign_time =explode('~', $param['sign_time']);
  172. $where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
  173. }
  174. if (!empty($param['end_time'])) {
  175. $end_time =explode('~', $param['end_time']);
  176. $where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
  177. }
  178. //是否是合同管理员
  179. $auth = isAuth($uid,'contract_admin','conf_1');
  180. if($auth == 0){
  181. $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
  182. $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
  183. $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
  184. $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
  185. $dids_a = get_leader_departments($uid);
  186. $dids_b = get_role_departments($uid);
  187. $dids = array_merge($dids_a, $dids_b);
  188. if(!empty($dids)){
  189. $whereOr[] = ['did','in',$dids];
  190. }
  191. }
  192. $list = $this->model->datalist($param,$where,$whereOr);
  193. return table_assign(0, '', $list);
  194. }
  195. else{
  196. return view();
  197. }
  198. }
  199. public function voidlist()
  200. {
  201. $param = get_params();
  202. if (request()->isAjax()) {
  203. $uid = $this->uid;
  204. $where = [];
  205. $whereOr = [];
  206. $where[]=['delete_time','=',0];
  207. $where[]=['void_time','>',0];
  208. if (!empty($param['keywords'])) {
  209. $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
  210. }
  211. if (!empty($param['types'])) {
  212. $where[] = ['types', '=',$param['types']];
  213. }
  214. if (!empty($param['cate_id'])) {
  215. $where[] = ['cate_id', '=',$param['cate_id']];
  216. }
  217. if (!empty($param['sign_time'])) {
  218. $sign_time =explode('~', $param['sign_time']);
  219. $where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
  220. }
  221. if (!empty($param['end_time'])) {
  222. $end_time =explode('~', $param['end_time']);
  223. $where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
  224. }
  225. //是否是合同管理员
  226. $auth = isAuth($uid,'contract_admin','conf_1');
  227. if($auth == 0){
  228. $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
  229. $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
  230. $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
  231. $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
  232. $dids_a = get_leader_departments($uid);
  233. $dids_b = get_role_departments($uid);
  234. $dids = array_merge($dids_a, $dids_b);
  235. if(!empty($dids)){
  236. $whereOr[] = ['did','in',$dids];
  237. }
  238. }
  239. $list = $this->model->datalist($param,$where,$whereOr);
  240. return table_assign(0, '', $list);
  241. }
  242. else{
  243. return view();
  244. }
  245. }
  246. /**
  247. * 添加/编辑
  248. */
  249. public function add()
  250. {
  251. $param = get_params();
  252. if (request()->isAjax()) {
  253. if (isset($param['sign_time'])) {
  254. $param['sign_time'] = strtotime($param['sign_time']);
  255. }
  256. if (isset($param['start_time'])) {
  257. $param['start_time'] = strtotime($param['start_time']);
  258. }
  259. if (isset($param['end_time'])) {
  260. $param['end_time'] = strtotime($param['end_time']);
  261. if ($param['end_time'] <= $param['start_time']) {
  262. return to_assign(1, "结束时间需要大于开始时间");
  263. }
  264. }
  265. if($param['scene'] == 'add' || $param['scene'] == 'edit'){
  266. $param['content'] = serialize([]);
  267. if($param['types']==2){
  268. $purchased_title_data = isset($param['purchased_title']) ? $param['purchased_title'] : '';
  269. $purchased_id_data = isset($param['purchased_id']) ? $param['purchased_id'] : 0;
  270. $purchased_unit_data = isset($param['purchased_unit']) ? $param['purchased_unit'] : '';
  271. $purchased_specs_data = isset($param['purchased_specs']) ? $param['purchased_specs'] : '';
  272. $purchased_price_data = isset($param['purchased_price']) ? $param['purchased_price'] : '0.00';
  273. $purchased_num_data = isset($param['purchased_num']) ? $param['purchased_num'] : 1;
  274. $purchased_subtotal_data = isset($param['purchased_subtotal']) ? $param['purchased_subtotal'] : '0.00';
  275. $purchased_remark_data = isset($param['purchased_remark']) ? $param['purchased_remark'] : '';
  276. $purchased = [];
  277. if(!empty($purchased_title_data)){
  278. foreach ($purchased_title_data as $key => $value) {
  279. if (!$value) {
  280. continue;
  281. }
  282. $data = [];
  283. $data['purchased_title'] = $purchased_title_data[$key];
  284. $data['purchased_id'] = $purchased_id_data[$key];
  285. $data['purchased_unit'] = $purchased_unit_data[$key];
  286. $data['purchased_specs'] = $purchased_specs_data[$key];
  287. $data['purchased_price'] = $purchased_price_data[$key];
  288. $data['purchased_num'] = $purchased_num_data[$key];
  289. $data['purchased_subtotal'] = $purchased_subtotal_data[$key];
  290. $data['purchased_remark'] = $purchased_remark_data[$key];
  291. $purchased[]=$data;
  292. }
  293. }
  294. $param['content'] = serialize($purchased);
  295. }
  296. if($param['types']==3){
  297. $service_title_data = isset($param['service_title']) ? $param['service_title'] : '';
  298. $service_time_a_data = isset($param['service_time_a']) ? $param['service_time_a'] : '';
  299. $service_time_b_data = isset($param['service_time_b']) ? $param['service_time_b'] : '';
  300. $service_date_data = isset($param['service_date']) ? $param['service_date'] : '';
  301. $service_price_data = isset($param['service_price']) ? $param['service_price'] : '0.00';
  302. $service_num_data = isset($param['service_num']) ? $param['service_num'] : 1;
  303. $service_subtotal_data = isset($param['service_subtotal']) ? $param['service_subtotal'] : '0.00';
  304. $service_remark_data = isset($param['service_remark']) ? $param['service_remark'] : '';
  305. $service = [];
  306. if(!empty($service_title_data)){
  307. foreach ($service_title_data as $key => $value) {
  308. if (!$value) {
  309. continue;
  310. }
  311. $data = [];
  312. $data['service_title'] = $service_title_data[$key];
  313. if(!empty($service_time_a_data)){
  314. $data['service_date'] = $service_time_a_data[$key].'到'.$service_time_b_data[$key];
  315. }
  316. else{
  317. $data['service_date'] = $service_date_data[$key];
  318. }
  319. $data['service_price'] = $service_price_data[$key];
  320. $data['service_num'] = $service_num_data[$key];
  321. $data['service_subtotal'] = $service_subtotal_data[$key];
  322. $data['service_remark'] = $service_remark_data[$key];
  323. $service[]=$data;
  324. }
  325. }
  326. $param['content'] = serialize($service);
  327. }
  328. }
  329. if (!empty($param['id']) && $param['id'] > 0) {
  330. try {
  331. validate(PurchaseValidate::class)->scene($param['scene'])->check($param);
  332. } catch (ValidateException $e) {
  333. // 验证失败 输出错误信息
  334. return to_assign(1, $e->getError());
  335. }
  336. $this->model->edit($param);
  337. } else {
  338. try {
  339. validate(PurchaseValidate::class)->scene($param['scene'])->check($param);
  340. } catch (ValidateException $e) {
  341. // 验证失败 输出错误信息
  342. return to_assign(1, $e->getError());
  343. }
  344. $param['admin_id'] = $this->uid;
  345. $this->model->add($param);
  346. }
  347. }else{
  348. $id = isset($param['id']) ? $param['id'] : 0;
  349. $types = isset($param['types']) ? $param['types'] : 0;
  350. $is_supplier = Db::name('DataAuth')->where('name','contract_admin')->value('conf_6');
  351. $is_codeno = Db::name('DataAuth')->where('name','contract_admin')->value('conf_2');
  352. $is_purchased = Db::name('DataAuth')->where('name','contract_admin')->value('conf_7');
  353. View::assign('is_supplier', $is_supplier);
  354. View::assign('is_codeno', $is_codeno);
  355. View::assign('is_purchased', $is_purchased);
  356. if ($id>0) {
  357. $detail = $this->model->getById($id);
  358. if($detail['check_status'] == 1 || $detail['check_status'] == 2 || $detail['check_status'] == 3){
  359. return view(EEEOR_REPORTING,['code'=>403,'warning'=>'当前状态不支持编辑']);
  360. }
  361. if($detail['types'] > 1){
  362. $content_array = unserialize($detail['content']);
  363. if($detail['types']==3){
  364. foreach ($content_array as $key => &$value) {
  365. if(!empty($value['service_date'])){
  366. $service_date = explode('到', $value['service_date']);
  367. $value['service_time_a'] = $service_date[0];
  368. $value['service_time_b'] = $service_date[1];
  369. }
  370. }
  371. }
  372. $detail['content_array'] = $content_array;
  373. }
  374. View::assign('types', $detail['types']);
  375. View::assign('codeno', $detail['code']);
  376. View::assign('detail', $detail);
  377. if(is_mobile()){
  378. return view('qiye@/contract/purchase_add');
  379. }
  380. return view('edit');
  381. }
  382. $codeno='';
  383. if($is_codeno==1){
  384. $codeno = get_codeno(2);
  385. }
  386. View::assign('codeno', $codeno);
  387. View::assign('id', $id);
  388. View::assign('types', $types);
  389. if($types == 0){
  390. return view('add_types');
  391. }
  392. if(is_mobile()){
  393. return view('qiye@/contract/purchase_add');
  394. }
  395. return view();
  396. }
  397. }
  398. /**
  399. * 查看
  400. */
  401. public function view($id)
  402. {
  403. $detail = $this->model->getById($id);
  404. if (!empty($detail)) {
  405. if($detail['types'] > 1){
  406. $content_array = unserialize($detail['content']);
  407. if($detail['types']==3){
  408. foreach ($content_array as $key => &$value) {
  409. if(!empty($value['service_date'])){
  410. $service_date = explode('到', $value['service_date']);
  411. $value['service_time_a'] = $service_date[0];
  412. $value['service_time_b'] = $service_date[1];
  413. }
  414. }
  415. }
  416. $detail['content_array'] = $content_array;
  417. }
  418. $detail['status_name'] = check_status_name($detail['check_status']);
  419. $detail['cate_title'] = Db::name('ContractCate')->where(['id' => $detail['cate_id']])->value('title');
  420. $detail['subject_title'] = Db::name('Enterprise')->where(['id' => $detail['subject_id']])->value('title');
  421. //归档信息
  422. if($detail['archive_uid'] > 0){
  423. $detail['archive_name'] = Db::name('Admin')->where(['id' => $detail['archive_uid']])->value('name');
  424. }
  425. //中止信息
  426. if($detail['stop_uid'] > 0){
  427. $detail['stop_name'] = Db::name('Admin')->where(['id' => $detail['stop_uid']])->value('name');
  428. }
  429. //作废信息
  430. if($detail['void_uid'] > 0){
  431. $detail['void_name'] = Db::name('Admin')->where(['id' => $detail['void_uid']])->value('name');
  432. }
  433. //收票和付款信息
  434. if($detail['check_status'] == 2){
  435. $detail['ticket'] = Db::name('Ticket')->field('t.*,a.name as admin')
  436. ->alias('t')
  437. ->join('Admin a', 'a.id = t.admin_id', 'LEFT')
  438. ->where([['t.purchase_id','=',$id],['t.open_status','<',2],['t.invoice_type','>',0],['t.delete_time','=',0]])
  439. ->order('t.create_time desc')
  440. ->select();
  441. $has_ticket = Db::name('Ticket')->where([['purchase_id','=',$id],['open_status','<',2],['invoice_type','>',0],['delete_time','=',0]])->sum('amount');
  442. $detail['has_ticket'] = sprintf("%.2f",$has_ticket);
  443. $detail['no_ticket'] = sprintf("%.2f",($detail['cost']*100 - $has_ticket*100)/100);
  444. $ticket_ids = Db::name('Ticket')->where([['purchase_id','=',$id],['open_status','<',2],['delete_time','=',0]])->column('id');
  445. $detail['payment'] = Db::name('TicketPayment')->field('t.*,a.name as admin')
  446. ->alias('t')
  447. ->join('Admin a', 'a.id = t.admin_id', 'LEFT')
  448. ->where([['t.ticket_id','in',$ticket_ids],['t.status','=',1]])
  449. ->order('t.pay_time desc')
  450. ->select();
  451. $has_payment = Db::name('TicketPayment')->where([['ticket_id','in',$ticket_ids],['status','=',1]])->sum('amount');
  452. $detail['has_payment'] = sprintf("%.2f",$has_payment);
  453. $detail['no_payment'] = sprintf("%.2f",($detail['cost']*100 - $has_payment*100)/100);
  454. }
  455. if($detail['seal_ids'] !=''){
  456. $file_array = Db::name('File')->where('id','in',$detail['seal_ids'])->select()->toArray();
  457. $detail['seal_array'] = $file_array;
  458. }
  459. else{
  460. $detail['seal_array'] = [];
  461. }
  462. $auth = isAuth($this->uid,'contract_admin','conf_1');
  463. View::assign('detail', $detail);
  464. View::assign('auth', $auth);
  465. if(is_mobile()){
  466. return view('qiye@/contract/purchase_view');
  467. }
  468. return view();
  469. }
  470. else{
  471. return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
  472. }
  473. }
  474. /**
  475. * 删除
  476. */
  477. public function del()
  478. {
  479. $param = get_params();
  480. $id = isset($param['id']) ? $param['id'] : 0;
  481. if (request()->isDelete()) {
  482. $this->model->delById($id);
  483. } else {
  484. return to_assign(1, "错误的请求");
  485. }
  486. }
  487. }