TestController.php 13 KB

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