TestController.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Exports\CompanyRdActivityExport;
  4. use App\Exports\ItemSalaryFTMultipleSheetExport;
  5. use App\Exports\ItemSalarySheetExport;
  6. use App\Exports\ManActivityTimeCardMultipleSheetExport;
  7. use App\Exports\ManMonthlyWorkHourMultipleSheetExport;
  8. use App\Exports\ProjectDepreciationMultipleSheetExport;
  9. use App\Exports\ProjectStaffExport;
  10. use App\Exports\ResearchExpenseMultipleSheetExport;
  11. use App\Exports\ResearchExpenseSummaryMultipleSheetExport;
  12. use App\Exports\ResearchProjectDetailMultiExport;
  13. use App\Exports\TechnicalStaffExport;
  14. use Maatwebsite\Excel\Facades\Excel;
  15. use PhpMqtt\Client\MqttClient;
  16. // --- 必须引入以下两个 MQTT 相关的类 ---
  17. use PhpMqtt\Client\ConnectionSettings;
  18. class TestController extends BaseController
  19. {
  20. public function aa(){
  21. return $this->testExport();
  22. $mqtt = new MqttClient('47.111.77.194', 1883, 'web_publisher');
  23. $mqtt->connect((new ConnectionSettings)->setUsername('yonglidev1')->setPassword('tZjUw0kQ'));
  24. $mqtt->publish('/wy/119/RealtimeData/DT5/yonglidev1', json_encode(['cmd' => 'reset']), 0);
  25. $mqtt->disconnect();
  26. return response()->json(['status' => '指令已下发']);
  27. }
  28. public function itemSalary(){
  29. // 1. 定义动态项目
  30. $projects = ['RD01', 'RD02', 'RD03', 'RD04', 'RD03', 'RD04' , 'RD03', 'RD04', 'RD03', 'RD04', 'RD03', 'RD04', 'RD03'];
  31. // 2. 构造导出数据 (从第5行开始的内容)
  32. $exportData = [
  33. // 第一行数据:2024年1月
  34. [
  35. '2024年1月', // 年月 (A列)
  36. '20', '5000', // RD01 天数, 工资
  37. '15', '4000', // RD02
  38. '10', '3000', // RD03
  39. '5', '1000', // RD04
  40. '5', '1000', // RD04
  41. '5', '1000', // RD04
  42. '5', '1000', // RD04
  43. '5', '1000', // RD04
  44. '5', '1000', // RD04
  45. '5', '1000', // RD04
  46. '5', '1000', // RD04
  47. '5', '1000', // RD04
  48. '5', '1000', // RD04
  49. '13000' // 合计 (最后一列)
  50. ],
  51. // 第二行数据:2024年2月
  52. [
  53. '2024年2月',
  54. '20', '5000', // RD01 天数, 工资
  55. '15', '4000', // RD02
  56. '10', '3000', // RD03
  57. '5', '1000', // RD04
  58. '5', '1000', // RD04
  59. '5', '1000', // RD04
  60. '5', '1000', // RD04
  61. '5', '1000', // RD04
  62. '5', '1000', // RD04
  63. '5', '1000', // RD04
  64. '5', '1000', // RD04
  65. '5', '1000', // RD04
  66. '5', '1000', // RD04
  67. '11300'
  68. ],
  69. [
  70. '2024年3月',
  71. '20', '5000', // RD01 天数, 工资
  72. '15', '4000', // RD02
  73. '10', '3000', // RD03
  74. '5', '1000', // RD04
  75. '5', '1000', // RD04
  76. '5', '1000', // RD04
  77. '5', '1000', // RD04
  78. '5', '1000', // RD04
  79. '5', '1000', // RD04
  80. '5', '1000', // RD04
  81. '5', '1000', // RD04
  82. '5', '1000', // RD04
  83. '5', '1000', // RD04
  84. '11300'
  85. ],
  86. [
  87. '2024年4月',
  88. '20', '5000', // RD01 天数, 工资
  89. '15', '4000', // RD02
  90. '10', '3000', // RD03
  91. '5', '1000', // RD04
  92. '5', '1000', // RD04
  93. '5', '1000', // RD04
  94. '5', '1000', // RD04
  95. '5', '1000', // RD04
  96. '5', '1000', // RD04
  97. '5', '1000', // RD04
  98. '5', '1000', // RD04
  99. '5', '1000', // RD04
  100. '5', '1000', // RD04
  101. '11300'
  102. ],
  103. [
  104. '合计',
  105. ],
  106. ];
  107. if(empty($file_name)) $file_name = date("Y-m-d") . "_". rand(1000,9999);
  108. $filename = $file_name . '.' . 'xlsx';
  109. $bool = Excel::store(new ItemSalarySheetExport($projects, $exportData),"/public/export/{$filename}", null, 'Xlsx', []);
  110. return $filename;
  111. }
  112. public function manActivityTimeCard(){
  113. $allProjectsData = [
  114. 'RD01无人机研发' => [
  115. ['1月', '研究人员', '张三', 192, 192, '100%', 8000, 1000, 500, 8000, 1000, 500, 8000, 1000, 500, 0, 0, 0],
  116. ['小计:', '', '', 192, 192, '100%', 8000, 1000, 500, 8000, 1000, 500, 8000, 1000, 500, 0, 0, 0],
  117. ['2月', '研究人员', '张三', 192, 192, '100%', 8000, 1000, 500, 8000, 1000, 500, 8000, 1000, 500, 0, 0, 0],
  118. ['小计:', '', '', 192, 192, '100%', 8000, 1000, 500, 8000, 1000, 500, 8000, 1000, 500, 0, 0, 0],
  119. ['合计', '', '', 192, 192, '', 8000, 1000, 500, 8000, 1000, 500, 8000, 1000, 500, 0, 0, 0],
  120. ],
  121. 'RD02自动化系统' => [
  122. ['1月', '技术人员', '李四', 160, 160, '100%', 7000, 800, 400, 7000, 800, 400, 7000, 800, 400, 0, 0, 0],
  123. ['小计:', '', '', 160, 160, '100%', 7000, 800, 400, 7000, 800, 400, 7000, 800, 400, 0, 0, 0],
  124. ['2月', '技术人员', '李四', 160, 160, '100%', 7000, 800, 400, 7000, 800, 400, 7000, 800, 400, 0, 0, 0],
  125. ['小计:', '', '', 160, 160, '100%', 7000, 800, 400, 7000, 800, 400, 7000, 800, 400, 0, 0, 0],
  126. ['合计', '', '', 160, 160, '', 7000, 800, 400, 7000, 800, 400, 7000, 800, 400, 0, 0, 0],
  127. ]
  128. ];
  129. if(empty($file_name)) $file_name = date("Y-m-d") . "_". rand(1000,9999);
  130. $filename = $file_name . '.' . 'xlsx';
  131. $bool = Excel::store(new ManActivityTimeCardMultipleSheetExport($allProjectsData), "/public/export/{$filename}", null, 'Xlsx', []);
  132. return $filename;
  133. }
  134. public function itemSalaryFT(){
  135. $monthsData = [
  136. '2024年4月' => [
  137. 'projects' => ['RD01', 'RD02', 'RD03',"aa"], // 4月有3个项目
  138. 'data' => [
  139. [1, '蔡1', 3165.00, 22, '', 8, 7, 7, 22, 0.00, 1150.91, 1007.05, 1007.04, 3165.00],
  140. [2, '蔡2', 4714.50, 22, '', 2, 8, 12, 22, 0.00, 428.59, 1714.36, 2571.55, 4714.50],
  141. ['合计', '', 30438.50, 110, 18, 14, 32, 46, 110, 6473.95, 2444.05, 7804.91, 13715.59, 30438.50]
  142. ]
  143. ],
  144. '2024年5月' => [
  145. 'projects' => ['RD01', 'RD02', 'RD03',"cs"], // 4月有3个项目
  146. 'data' => [
  147. [1, '蔡1', 3165.00, 22, '', 8, 7, 7, 22, 0.00, 1150.91, 1007.05, 1007.04, 3165.00],
  148. [2, '蔡2', 4714.50, 22, '', 2, 8, 12, 22, 0.00, 428.59, 1714.36, 2571.55, 4714.50],
  149. ['合计', '', 30438.50, 110, 18, 14, 32, 46, 110, 6473.95, 2444.05, 7804.91, 13715.59, 30438.50]
  150. ]
  151. ],
  152. '2024年6月' => [
  153. 'projects' => ['RD01', 'RD02', 'RD03'], // 4月有3个项目
  154. 'data' => [
  155. [1, '蔡1', 3165.00, 22, '', 8, 7, 7, 22, 0.00, 1150.91, 1007.05],
  156. [2, '蔡2', 4714.50, 22, '', 2, 8, 12, 22, 0.00, 428.59, 1714.36],
  157. ['合计', '', 30438.50, 110, 18, 14, 32, 46, 110, 6473.95, 2444.05, 7804.91]
  158. ]
  159. ]
  160. ];
  161. if(empty($file_name)) $file_name = date("Y-m-d") . "_". rand(1000,9999);
  162. $filename = $file_name . '.' . 'xlsx';
  163. $bool = Excel::store(new ItemSalaryFTMultipleSheetExport($monthsData), "/public/export/{$filename}", null, 'Xlsx', []);
  164. return $filename;
  165. }
  166. public function manMonthlyWorkHour(){
  167. $monthsData = [
  168. '2024年4月' => [
  169. 'days' => 30,
  170. 'data' => [
  171. // 项目, 姓名, 1日, 2日, 3日, 4日... (空字符串代表没工时)
  172. ['RD02', '蔡1', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1],
  173. ['RD03', '蔡2', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', ''],
  174. ['RD05', '蔡3', '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, ''],
  175. ]
  176. ]
  177. ];
  178. if(empty($file_name)) $file_name = date("Y-m-d") . "_". rand(1000,9999);
  179. $filename = $file_name . '.' . 'xlsx';
  180. $bool = Excel::store(new ManMonthlyWorkHourMultipleSheetExport($monthsData), "/public/export/{$filename}", null, 'Xlsx', []);
  181. return $filename;
  182. }
  183. public function deviceZj(){
  184. $monthsData = [
  185. // 第一个 Sheet: 2025年-RD01项目
  186. '2025-RD01' => [
  187. 'project_name' => '智能AI语音助手开发项目',
  188. 'months' => $this->generateTwelveMonthsData() // 生成1-12月模拟数据
  189. ],
  190. // 第二个 Sheet: 2025年-RD02项目
  191. '2025-RD02' => [
  192. 'project_name' => '云端大数据分析平台',
  193. 'months' => $this->generateTwelveMonthsData()
  194. ],
  195. ];
  196. if(empty($file_name)) $file_name = date("Y-m-d") . "_". rand(1000,9999);
  197. $filename = $file_name . '.' . 'xlsx';
  198. $bool = Excel::store(new ProjectDepreciationMultipleSheetExport($monthsData), "/public/export/{$filename}", null, 'Xlsx', []);
  199. return $filename;
  200. }
  201. private function generateTwelveMonthsData()
  202. {
  203. $yearData = [];
  204. for ($m = 1; $m <= 12; $m++) {
  205. $yearData[$m] = [
  206. [
  207. 'name' => '青爻APC-110自动扫码枪',
  208. 'total_hours' => 160,
  209. 'project_hours' => 80,
  210. 'ratio' => 50,
  211. 'original_value' => 213675.21,
  212. 'depreciation' => 1691.60,
  213. 'confirmed_depreciation' => 338.32,
  214. 'adjust_amount' => -338.32,
  215. ],
  216. [
  217. 'name' => '自动美式三插端子系统',
  218. 'total_hours' => 160,
  219. 'project_hours' => 40,
  220. 'ratio' => 25,
  221. 'original_value' => 30769.23,
  222. 'depreciation' => 243.59,
  223. 'confirmed_depreciation' => 48.72,
  224. 'adjust_amount' => -48.72,
  225. ]
  226. ];
  227. }
  228. return $yearData;
  229. }
  230. public function exportSummary()
  231. {
  232. // 定义你的动态科目(前 N 项)
  233. // 注意:这里的顺序决定了 Excel 中 F 列往后的顺序
  234. $dynamicHeaders = ['人员人工费用', '直接投入费用', '折旧费用', '无形资产摊销', '新产品设计费等'];
  235. $items = [];
  236. for ($i = 1; $i <= 10; $i++) {
  237. $type = $i <= 5 ? '资本化支出' : '费用化支出';
  238. $items[] = [
  239. 'no' => 'RD0' . $i,
  240. 'name' => '研发项目名称测试_' . $i,
  241. 'status' => rand(2, 3),
  242. 'type' => $type,
  243. // 【重要】将明细金额放入 values 数组,顺序必须对应 $dynamicHeaders
  244. 'values' => [
  245. 1 * $i, // 人员人工
  246. 2 * $i, // 直接投入
  247. 3 * $i, // 折旧
  248. 4 * $i, // 无形资产
  249. 5 * $i // 新产品
  250. ],
  251. 'val7_1' => 6, // 其他相关费用合计 (7.1)
  252. 'val8_1' => 7, // 委托境内 (8.1)
  253. 'val8_3' => 8, // 委托境外 (8.3) -> 原代码写 8.4 是不对的,公式会自动算 8.4
  254. ];
  255. }
  256. $monthsData = [
  257. '2026' => [
  258. 'tax_id' => '91330101MA28XXXXXX',
  259. 'company_name' => '杭州青艾科技有限公司',
  260. 'items' => $items,
  261. 'dynamic_headers' => $dynamicHeaders // 将配置也放入 payload 方便后面读取
  262. ]
  263. ];
  264. $file_name = "研发支出汇总表_" . date("YmdHis");
  265. $filename = $file_name . '.xlsx';
  266. // 传入 $dynamicHeaders 到构造函数
  267. Excel::store(
  268. new ResearchExpenseSummaryMultipleSheetExport($monthsData),
  269. "public/export/{$filename}"
  270. );
  271. return $filename;
  272. }
  273. public function exportResearchExpense()
  274. {
  275. $sheetsData = [
  276. '2025-RD01' => [
  277. 'project' => ['code' => '2025RD01', 'name' => '自动化设备研发'],
  278. // 这里定义除了 人员人工和折旧 之外的其他科目
  279. 'dynamic_headers' => ['直接投入费用', '无形资产摊销', '其他相关费用'],
  280. 'data' => [
  281. // 每一行数据的长度必须与:基础(6列) + 固定明细(2列) + 动态明细(N列) + 委托(2列) 的总长度一致
  282. ['2025/01/31', '记账', '33', '原材料领用', 1000, 1000, 0, 0, 1000, 0, 0, 0, 0],
  283. ['合计', '', '', '', 1000, 1000, 0, 0, 1000, 0, 0, 0, 0]
  284. ]
  285. ],
  286. '2025-RD02' => [
  287. 'project' => ['code' => '2025RD02', 'name' => '简易项目'],
  288. 'dynamic_headers' => ['其他相关费用'], // 这个Sheet只有1个动态列
  289. 'data' => [
  290. ['2025/02/15', '记账', '12', '技术服务费', 500, 500, 0, 0, 500, 0, 0],
  291. ['合计', '', '', '', 500, 500, 0, 0, 500, 0, 0]
  292. ]
  293. ]
  294. ];
  295. $file_name = date("YmdHis");
  296. $filename = $file_name . '.xlsx';
  297. Excel::store(
  298. new ResearchExpenseMultipleSheetExport($sheetsData),
  299. "public/export/{$filename}"
  300. );
  301. return $filename;
  302. }
  303. //最长的报表
  304. public function rdB(){
  305. // 示例数据准备 (通常从数据库查询得出)
  306. $year = 2026;
  307. $taxInfo = [
  308. 'tax_id' => '91330101MA28XXXXXX',
  309. 'tax_name' => '杭州青艾科技有限公司'
  310. ];
  311. $projects = [
  312. [
  313. 'project_no' => 'RD01',
  314. 'details' => [
  315. [
  316. // A-J (10个)
  317. 'p_name'=>'AI项目', 'id'=>1, 'rd_name'=>'智能识别', 'rd_code'=>'RD01',
  318. 'form'=>'自主研发', 'opt'=>'费用化', 'status'=>'已完成', 'rel'=>'否', 'os'=>'否', 'res'=>'软著',
  319. 'res_no' => '2026SR123456',
  320. // K-M (3个)
  321. 'v1_1'=>8000, 'v1_2'=>1200, 'v1_3'=>0,
  322. // N-U (8个)
  323. 'v2_1'=>1500, 'v2_2'=>100, 'v2_3'=>50, 'v2_4'=>0, 'v2_5'=>0, 'v2_6'=>200, 'v2_7'=>0, 'v2_8'=>0,
  324. // V-W (2个)
  325. 'v3_1'=>400, 'v3_2'=>0,
  326. // X-Z (3个)
  327. 'v4_1'=>300, 'v4_2'=>0, 'v4_3'=>0,
  328. // AA-AD (4个)
  329. 'v5_1'=>500, 'v5_2'=>0, 'v5_3'=>0, 'v5_4'=>0,
  330. // AE-AI (5个)
  331. 'v6_1'=>100, 'v6_2'=>0, 'v6_3'=>200, 'v6_4'=>0, 'v6_5'=>150,
  332. // AJ-AN (汇总)
  333. 'v7'=>0, 'v7_1'=>0,
  334. 'v8'=>10200, // 栏次 8:前五项合计
  335. 'v8_1'=>1133.33, // 栏次 8.1:限额
  336. 'v9' => 11333.33 // 九、总额
  337. ]
  338. ]
  339. ]
  340. ];
  341. $file_name = "研发支出汇总表_" . date("YmdHis");
  342. $filename = $file_name . '.xlsx';
  343. // 传入 $dynamicHeaders 到构造函数
  344. Excel::store(
  345. new ResearchProjectDetailMultiExport($year, $projects, $taxInfo),
  346. "public/export/{$filename}"
  347. );
  348. return $filename;
  349. }
  350. //企业研究开发活动汇总表
  351. public function exportRdSummary() {
  352. // 模拟从数据库获取的研发活动列表数据
  353. $rdData = [
  354. [
  355. 'activity_name' => '智能AI图像识别算法研发项目',
  356. 'time_range' => '2025.01-2025.12',
  357. 'budget' => 500000.00,
  358. 'actual_spending' => 485000.50,
  359. 'tech_area' => '人工智能',
  360. 'remark' => '核心算法已申请软著',
  361. ],
  362. [
  363. 'activity_name' => '高并发云原生架构优化',
  364. 'time_range' => '2025.03-2025.10',
  365. 'budget' => 300000.00,
  366. 'actual_spending' => 310000.00,
  367. 'tech_area' => '云计算',
  368. 'remark' => '超出预算部分已通过审批',
  369. ],
  370. ];
  371. $file_name = "企业研发活动汇总表_" . date("YmdHis");
  372. $filename = $file_name . '.xlsx';
  373. // 触发导出
  374. Excel::store(
  375. new CompanyRdActivityExport($rdData),
  376. "public/export/{$filename}"
  377. );
  378. return $filename;
  379. }
  380. // 企业研究开发科技人员情况表
  381. public function exportTechnicalStaff()
  382. {
  383. // 模拟测试数据,对应图片中的示例内容
  384. $testData = [
  385. [
  386. 'name' => '张三',
  387. 'id_card' => '33010119900101XXXX',
  388. 'education' => '本科',
  389. 'major' => '计算机科学',
  390. 'title_level' => '高级工程师',
  391. 'department_job' => "技术部/\n系统集成工程师",
  392. 'employment_type' => '在职',
  393. ],
  394. [
  395. 'name' => '李四',
  396. 'id_card' => '33010119920202XXXX',
  397. 'education' => '硕士',
  398. 'major' => '机械工程',
  399. 'title_level' => "工程师/\n注册电气工程师",
  400. 'department_job' => "生产部/\n模具制作师",
  401. 'employment_type' => '在职',
  402. ],
  403. [
  404. 'name' => '王五',
  405. 'id_card' => '33010119950505XXXX',
  406. 'education' => '大专',
  407. 'major' => '自动化',
  408. 'title_level' => '助理工程师',
  409. 'department_job' => "生产部/\n产品试制研发辅助员",
  410. 'employment_type' => '临聘',
  411. ],
  412. [
  413. 'name' => '赵六',
  414. 'id_card' => '33010119800808XXXX',
  415. 'education' => '博士',
  416. 'major' => '电子工程',
  417. 'title_level' => '教授/电工证',
  418. 'department_job' => '研发部/技术顾问',
  419. 'employment_type' => '兼职',
  420. ]
  421. ];
  422. $filename = '企业研究开发科技人员情况表_' . date('Ymd') . '.xlsx';
  423. Excel::store(new TechnicalStaffExport($testData), "public/export/{$filename}");
  424. return $filename;
  425. }
  426. //项目研发活动人员情况表
  427. public function testExport()
  428. {
  429. // 模拟数据:对应图片中的角色定义示例
  430. $data = [
  431. [
  432. 'name' => '张技术',
  433. 'education' => '本科',
  434. 'major' => '机械设计',
  435. 'title' => '高级工程师',
  436. 'role_desc' => '项目负责人',
  437. 'role_name' => '总指挥',
  438. 'dept' => '研发部',
  439. 'duty' => '负责项目整体进度把控与技术架构设计',
  440. ],
  441. [
  442. 'name' => '李研发',
  443. 'education' => '硕士',
  444. 'major' => '自动化',
  445. 'title' => '工程师',
  446. 'role_desc' => '技术负责人',
  447. 'role_name' => '核心研发',
  448. 'dept' => '技术部',
  449. 'duty' => '负责核心算法编写与系统集成',
  450. ],
  451. [
  452. 'name' => '王测试',
  453. 'education' => '大专',
  454. 'major' => '电子信息',
  455. 'title' => '助工',
  456. 'role_desc' => '测试工程师',
  457. 'role_name' => '质量检测',
  458. 'dept' => '质检部',
  459. 'duty' => '负责产品试制阶段的可靠性测试',
  460. ]
  461. ];
  462. $filename = '项目研发活动人员情况表' . date('Ymd') . '.xlsx';
  463. Excel::store(new ProjectStaffExport($data), "public/export/{$filename}");
  464. return $filename;
  465. }
  466. }