TestController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Exports\ItemSalaryFTMultipleSheetExport;
  4. use App\Exports\ItemSalarySheetExport;
  5. use App\Exports\ManActivityTimeCardMultipleSheetExport;
  6. use App\Exports\ManMonthlyWorkHourMultipleSheetExport;
  7. use App\Exports\ProjectDepreciationMultipleSheetExport;
  8. use App\Exports\ResearchExpenseMultipleSheetExport;
  9. use App\Exports\ResearchExpenseSummaryMultipleSheetExport;
  10. use Maatwebsite\Excel\Facades\Excel;
  11. use PhpMqtt\Client\MqttClient;
  12. // --- 必须引入以下两个 MQTT 相关的类 ---
  13. use PhpMqtt\Client\ConnectionSettings;
  14. class TestController extends BaseController
  15. {
  16. public function aa(){
  17. // return $this->exportSummary();
  18. $mqtt = new MqttClient('47.111.77.194', 1883, 'web_publisher');
  19. $mqtt->connect((new ConnectionSettings)->setUsername('yonglidev1')->setPassword('tZjUw0kQ'));
  20. $mqtt->publish('/wy/119/RealtimeData/DT5/yonglidev1', json_encode(['cmd' => 'reset']), 0);
  21. $mqtt->disconnect();
  22. return response()->json(['status' => '指令已下发']);
  23. }
  24. public function itemSalary(){
  25. // 1. 定义动态项目
  26. $projects = ['RD01', 'RD02', 'RD03', 'RD04', 'RD03', 'RD04' , 'RD03', 'RD04', 'RD03', 'RD04', 'RD03', 'RD04', 'RD03'];
  27. // 2. 构造导出数据 (从第5行开始的内容)
  28. $exportData = [
  29. // 第一行数据:2024年1月
  30. [
  31. '2024年1月', // 年月 (A列)
  32. '20', '5000', // RD01 天数, 工资
  33. '15', '4000', // RD02
  34. '10', '3000', // RD03
  35. '5', '1000', // RD04
  36. '5', '1000', // RD04
  37. '5', '1000', // RD04
  38. '5', '1000', // RD04
  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. '13000' // 合计 (最后一列)
  46. ],
  47. // 第二行数据:2024年2月
  48. [
  49. '2024年2月',
  50. '20', '5000', // RD01 天数, 工资
  51. '15', '4000', // RD02
  52. '10', '3000', // RD03
  53. '5', '1000', // RD04
  54. '5', '1000', // RD04
  55. '5', '1000', // RD04
  56. '5', '1000', // RD04
  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. '11300'
  64. ],
  65. [
  66. '2024年3月',
  67. '20', '5000', // RD01 天数, 工资
  68. '15', '4000', // RD02
  69. '10', '3000', // RD03
  70. '5', '1000', // RD04
  71. '5', '1000', // RD04
  72. '5', '1000', // RD04
  73. '5', '1000', // RD04
  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. '11300'
  81. ],
  82. [
  83. '2024年4月',
  84. '20', '5000', // RD01 天数, 工资
  85. '15', '4000', // RD02
  86. '10', '3000', // RD03
  87. '5', '1000', // RD04
  88. '5', '1000', // RD04
  89. '5', '1000', // RD04
  90. '5', '1000', // RD04
  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. '11300'
  98. ],
  99. [
  100. '合计',
  101. ],
  102. ];
  103. if(empty($file_name)) $file_name = date("Y-m-d") . "_". rand(1000,9999);
  104. $filename = $file_name . '.' . 'xlsx';
  105. $bool = Excel::store(new ItemSalarySheetExport($projects, $exportData),"/public/export/{$filename}", null, 'Xlsx', []);
  106. return $filename;
  107. }
  108. public function manActivityTimeCard(){
  109. $allProjectsData = [
  110. 'RD01无人机研发' => [
  111. ['1月', '研究人员', '张三', 192, 192, '100%', 8000, 1000, 500, 8000, 1000, 500, 8000, 1000, 500, 0, 0, 0],
  112. ['小计:', '', '', 192, 192, '100%', 8000, 1000, 500, 8000, 1000, 500, 8000, 1000, 500, 0, 0, 0],
  113. ['2月', '研究人员', '张三', 192, 192, '100%', 8000, 1000, 500, 8000, 1000, 500, 8000, 1000, 500, 0, 0, 0],
  114. ['小计:', '', '', 192, 192, '100%', 8000, 1000, 500, 8000, 1000, 500, 8000, 1000, 500, 0, 0, 0],
  115. ['合计', '', '', 192, 192, '', 8000, 1000, 500, 8000, 1000, 500, 8000, 1000, 500, 0, 0, 0],
  116. ],
  117. 'RD02自动化系统' => [
  118. ['1月', '技术人员', '李四', 160, 160, '100%', 7000, 800, 400, 7000, 800, 400, 7000, 800, 400, 0, 0, 0],
  119. ['小计:', '', '', 160, 160, '100%', 7000, 800, 400, 7000, 800, 400, 7000, 800, 400, 0, 0, 0],
  120. ['2月', '技术人员', '李四', 160, 160, '100%', 7000, 800, 400, 7000, 800, 400, 7000, 800, 400, 0, 0, 0],
  121. ['小计:', '', '', 160, 160, '100%', 7000, 800, 400, 7000, 800, 400, 7000, 800, 400, 0, 0, 0],
  122. ['合计', '', '', 160, 160, '', 7000, 800, 400, 7000, 800, 400, 7000, 800, 400, 0, 0, 0],
  123. ]
  124. ];
  125. if(empty($file_name)) $file_name = date("Y-m-d") . "_". rand(1000,9999);
  126. $filename = $file_name . '.' . 'xlsx';
  127. $bool = Excel::store(new ManActivityTimeCardMultipleSheetExport($allProjectsData), "/public/export/{$filename}", null, 'Xlsx', []);
  128. return $filename;
  129. }
  130. public function itemSalaryFT(){
  131. $monthsData = [
  132. '2024年4月' => [
  133. 'projects' => ['RD01', 'RD02', 'RD03',"aa"], // 4月有3个项目
  134. 'data' => [
  135. [1, '蔡1', 3165.00, 22, '', 8, 7, 7, 22, 0.00, 1150.91, 1007.05, 1007.04, 3165.00],
  136. [2, '蔡2', 4714.50, 22, '', 2, 8, 12, 22, 0.00, 428.59, 1714.36, 2571.55, 4714.50],
  137. ['合计', '', 30438.50, 110, 18, 14, 32, 46, 110, 6473.95, 2444.05, 7804.91, 13715.59, 30438.50]
  138. ]
  139. ],
  140. '2024年5月' => [
  141. 'projects' => ['RD01', 'RD02', 'RD03',"cs"], // 4月有3个项目
  142. 'data' => [
  143. [1, '蔡1', 3165.00, 22, '', 8, 7, 7, 22, 0.00, 1150.91, 1007.05, 1007.04, 3165.00],
  144. [2, '蔡2', 4714.50, 22, '', 2, 8, 12, 22, 0.00, 428.59, 1714.36, 2571.55, 4714.50],
  145. ['合计', '', 30438.50, 110, 18, 14, 32, 46, 110, 6473.95, 2444.05, 7804.91, 13715.59, 30438.50]
  146. ]
  147. ],
  148. '2024年6月' => [
  149. 'projects' => ['RD01', 'RD02', 'RD03'], // 4月有3个项目
  150. 'data' => [
  151. [1, '蔡1', 3165.00, 22, '', 8, 7, 7, 22, 0.00, 1150.91, 1007.05],
  152. [2, '蔡2', 4714.50, 22, '', 2, 8, 12, 22, 0.00, 428.59, 1714.36],
  153. ['合计', '', 30438.50, 110, 18, 14, 32, 46, 110, 6473.95, 2444.05, 7804.91]
  154. ]
  155. ]
  156. ];
  157. if(empty($file_name)) $file_name = date("Y-m-d") . "_". rand(1000,9999);
  158. $filename = $file_name . '.' . 'xlsx';
  159. $bool = Excel::store(new ItemSalaryFTMultipleSheetExport($monthsData), "/public/export/{$filename}", null, 'Xlsx', []);
  160. return $filename;
  161. }
  162. public function manMonthlyWorkHour(){
  163. $monthsData = [
  164. '2024年4月' => [
  165. 'days' => 30,
  166. 'data' => [
  167. // 项目, 姓名, 1日, 2日, 3日, 4日... (空字符串代表没工时)
  168. ['RD02', '蔡1', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1],
  169. ['RD03', '蔡2', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', ''],
  170. ['RD05', '蔡3', '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, '', '', 1, ''],
  171. ]
  172. ]
  173. ];
  174. if(empty($file_name)) $file_name = date("Y-m-d") . "_". rand(1000,9999);
  175. $filename = $file_name . '.' . 'xlsx';
  176. $bool = Excel::store(new ManMonthlyWorkHourMultipleSheetExport($monthsData), "/public/export/{$filename}", null, 'Xlsx', []);
  177. return $filename;
  178. }
  179. public function deviceZj(){
  180. $monthsData = [
  181. // 第一个 Sheet: 2025年-RD01项目
  182. '2025-RD01' => [
  183. 'project_name' => '智能AI语音助手开发项目',
  184. 'months' => $this->generateTwelveMonthsData() // 生成1-12月模拟数据
  185. ],
  186. // 第二个 Sheet: 2025年-RD02项目
  187. '2025-RD02' => [
  188. 'project_name' => '云端大数据分析平台',
  189. 'months' => $this->generateTwelveMonthsData()
  190. ],
  191. ];
  192. if(empty($file_name)) $file_name = date("Y-m-d") . "_". rand(1000,9999);
  193. $filename = $file_name . '.' . 'xlsx';
  194. $bool = Excel::store(new ProjectDepreciationMultipleSheetExport($monthsData), "/public/export/{$filename}", null, 'Xlsx', []);
  195. return $filename;
  196. }
  197. private function generateTwelveMonthsData()
  198. {
  199. $yearData = [];
  200. for ($m = 1; $m <= 12; $m++) {
  201. $yearData[$m] = [
  202. [
  203. 'name' => '青爻APC-110自动扫码枪',
  204. 'total_hours' => 160,
  205. 'project_hours' => 80,
  206. 'ratio' => 50,
  207. 'original_value' => 213675.21,
  208. 'depreciation' => 1691.60,
  209. 'confirmed_depreciation' => 338.32,
  210. 'adjust_amount' => -338.32,
  211. ],
  212. [
  213. 'name' => '自动美式三插端子系统',
  214. 'total_hours' => 160,
  215. 'project_hours' => 40,
  216. 'ratio' => 25,
  217. 'original_value' => 30769.23,
  218. 'depreciation' => 243.59,
  219. 'confirmed_depreciation' => 48.72,
  220. 'adjust_amount' => -48.72,
  221. ]
  222. ];
  223. }
  224. return $yearData;
  225. }
  226. public function exportSummary()
  227. {
  228. // 定义你的动态科目(前 N 项)
  229. // 注意:这里的顺序决定了 Excel 中 F 列往后的顺序
  230. $dynamicHeaders = ['人员人工费用', '直接投入费用', '折旧费用', '无形资产摊销', '新产品设计费等'];
  231. $items = [];
  232. for ($i = 1; $i <= 10; $i++) {
  233. $type = $i <= 5 ? '资本化支出' : '费用化支出';
  234. $items[] = [
  235. 'no' => 'RD0' . $i,
  236. 'name' => '研发项目名称测试_' . $i,
  237. 'status' => rand(2, 3),
  238. 'type' => $type,
  239. // 【重要】将明细金额放入 values 数组,顺序必须对应 $dynamicHeaders
  240. 'values' => [
  241. 1 * $i, // 人员人工
  242. 2 * $i, // 直接投入
  243. 3 * $i, // 折旧
  244. 4 * $i, // 无形资产
  245. 5 * $i // 新产品
  246. ],
  247. 'val7_1' => 6, // 其他相关费用合计 (7.1)
  248. 'val8_1' => 7, // 委托境内 (8.1)
  249. 'val8_3' => 8, // 委托境外 (8.3) -> 原代码写 8.4 是不对的,公式会自动算 8.4
  250. ];
  251. }
  252. $monthsData = [
  253. '2026' => [
  254. 'tax_id' => '91330101MA28XXXXXX',
  255. 'company_name' => '杭州青艾科技有限公司',
  256. 'items' => $items,
  257. 'dynamic_headers' => $dynamicHeaders // 将配置也放入 payload 方便后面读取
  258. ]
  259. ];
  260. $file_name = "研发支出汇总表_" . date("YmdHis");
  261. $filename = $file_name . '.xlsx';
  262. // 传入 $dynamicHeaders 到构造函数
  263. Excel::store(
  264. new ResearchExpenseSummaryMultipleSheetExport($monthsData),
  265. "public/export/{$filename}"
  266. );
  267. return $filename;
  268. }
  269. public function exportResearchExpense()
  270. {
  271. $sheetsData = [
  272. '2025-RD01' => [
  273. 'project' => ['code' => '2025RD01', 'name' => '自动化设备研发'],
  274. // 这里定义除了 人员人工和折旧 之外的其他科目
  275. 'dynamic_headers' => ['直接投入费用', '无形资产摊销', '其他相关费用'],
  276. 'data' => [
  277. // 每一行数据的长度必须与:基础(6列) + 固定明细(2列) + 动态明细(N列) + 委托(2列) 的总长度一致
  278. ['2025/01/31', '记账', '33', '原材料领用', 1000, 1000, 0, 0, 1000, 0, 0, 0, 0],
  279. ['合计', '', '', '', 1000, 1000, 0, 0, 1000, 0, 0, 0, 0]
  280. ]
  281. ],
  282. '2025-RD02' => [
  283. 'project' => ['code' => '2025RD02', 'name' => '简易项目'],
  284. 'dynamic_headers' => ['其他相关费用'], // 这个Sheet只有1个动态列
  285. 'data' => [
  286. ['2025/02/15', '记账', '12', '技术服务费', 500, 500, 0, 0, 500, 0, 0],
  287. ['合计', '', '', '', 500, 500, 0, 0, 500, 0, 0]
  288. ]
  289. ]
  290. ];
  291. $file_name = date("YmdHis");
  292. $filename = $file_name . '.xlsx';
  293. Excel::store(
  294. new ResearchExpenseMultipleSheetExport($sheetsData),
  295. "public/export/{$filename}"
  296. );
  297. return $filename;
  298. }
  299. }