index copy 2.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. <script setup lang="ts">
  2. import BatchModal from "@/views/common/modal/batchModal.vue"
  3. import dayjs from "dayjs"
  4. import apis from "@/api/breeding"
  5. // 初始化默认日期范围为最近一个月
  6. const getDefaultDateRange = () => {
  7. const endDate = dayjs()
  8. const startDate = endDate.subtract(1, 'month')
  9. return [startDate.format('YYYY-MM-DD'), endDate.format('YYYY-MM-DD')]
  10. }
  11. const formData = ref({
  12. batchNum: "",
  13. recordDate: "",
  14. dateRange: getDefaultDateRange(),
  15. params: {},
  16. type: 0
  17. })
  18. // 批次选择模态框相关
  19. const batchModalRef = ref()
  20. const selectedBatch = ref("")
  21. // 打开批次选择模态框
  22. function openBatchModal() {
  23. batchModalRef.value?.open()
  24. }
  25. // 批次选择确认回调
  26. function onBatchConfirm(batches: any[]) {
  27. if (batches && batches.length > 0) {
  28. selectedBatch.value = batches[0].batchNum
  29. formData.value.batchNum = selectedBatch.value
  30. }
  31. }
  32. // 育种场信息数据
  33. const batchInfo = ref({
  34. batchNum: "",
  35. chickenCount0: "",
  36. chickenCount1: "",
  37. chickenCount2: "",
  38. factoryName: "",
  39. coopNames: "",
  40. lineage: "",
  41. generation: "",
  42. hatchDate: "",
  43. source: "",
  44. })
  45. const reportDataItems=ref([])
  46. // 查询处理函数
  47. function handleSearch() {
  48. console.log('执行查询操作,批次号:', formData.value.batchNum)
  49. console.log('日期范围:', formData.value.dateRange)
  50. formData.value.params = {
  51. beginRecordDate: formData.value.dateRange[0],
  52. endRecordDate: formData.value.dateRange[1]
  53. }
  54. if(!formData.value.batchNum) {
  55. message.msgError("请选择批次")
  56. return
  57. }
  58. apis.batchDayStatisticsApi.getBatchDetail(formData.value.batchNum).then((res: any) => {
  59. console.log(res)
  60. batchInfo.value = res.data
  61. })
  62. apis.batchDayStatisticsApi.listQuery(formData.value).then((res: any) => {
  63. console.log(res)
  64. reportDataItems.value = res.data
  65. })
  66. // 这里可以添加实际的查询逻辑
  67. // 例如调用API获取数据等
  68. }
  69. // 导出处理函数
  70. function handleExport() {
  71. console.log('导出报表,批次号:', formData.value.batchNum)
  72. if(!formData.value.batchNum) {
  73. message.msgError("请选择批次")
  74. return
  75. }
  76. formData.value.params = {
  77. beginRecordDate: formData.value.dateRange[0],
  78. endRecordDate: formData.value.dateRange[1]
  79. }
  80. apis.batchDayStatisticsApi.export(formData.value, formData.value.batchNum + "日报表.xlsx").then((res: any) => {
  81. console.log(res)
  82. message.msgSuccess("导出成功")
  83. }).catch((error: any) => {
  84. console.error("导出失败:", error)
  85. message.msgError("导出失败")
  86. })
  87. }
  88. function handleGenerateReport(type) {
  89. if(!formData.value.batchNum) {
  90. message.msgError("请选择批次")
  91. return
  92. }
  93. formData.value.recordDate = formData.value.dateRange[1]
  94. formData.value.type = type
  95. apis.batchDayStatisticsApi.genReportFun(formData.value).then(() => {
  96. message.msgSuccess("生成成功")
  97. })
  98. }
  99. // 日期格式化函数
  100. const formatDate = (row, column, cellValue) => {
  101. return dayjs(cellValue).format('YYYY/MM/DD')
  102. }
  103. // 单元格样式
  104. const cellStyle = ({ row, column, rowIndex, columnIndex }) => {
  105. // 日期列居中对齐
  106. if (columnIndex === 0) { // 日期列
  107. return { textAlign: 'center' }
  108. }
  109. // 数字列右对齐
  110. if (columnIndex >= 3) { // 从第4列开始右对齐
  111. return { textAlign: 'right' }
  112. }
  113. return { textAlign: 'center' }
  114. }
  115. // 将函数暴露给模板使用
  116. defineExpose({
  117. formatDate,
  118. //headerCellStyle,
  119. cellStyle
  120. })
  121. </script>
  122. <template>
  123. <div class="app-container py-5">
  124. <div
  125. class="w-100 d-flex flex-column align-items-center mx-auto"
  126. :style="{ maxWidth: 1500 + 'px' }">
  127. <div class="header d-flex justify-content-center align-items-center mb-10">
  128. <el-form :model="formData" label-width="auto" :inline="true" style="margin-left: 20px">
  129. <el-form-item label="批次" prop="batchNum">
  130. <el-input v-model="formData.batchNum" placeholder="请选择批次" readonly>
  131. <template #append>
  132. <el-button @click="openBatchModal">选择</el-button>
  133. </template>
  134. </el-input>
  135. </el-form-item>
  136. <el-form-item label="日期范围" prop="dateRange">
  137. <el-date-picker
  138. v-model="formData.dateRange"
  139. type="daterange"
  140. range-separator="至"
  141. start-placeholder="开始日期"
  142. end-placeholder="结束日期"
  143. value-format="YYYY-MM-DD"
  144. format="YYYY-MM-DD"
  145. style="width: 220px;">
  146. </el-date-picker>
  147. </el-form-item>
  148. <el-form-item>
  149. <el-button type="primary" @click="handleSearch">查询</el-button>
  150. <el-button type="warning" @click="handleExport">导出</el-button>
  151. <el-button type="success" @click="handleGenerateReport(0)">生成日报表0</el-button>
  152. <el-button type="success" @click="handleGenerateReport(1)">生成日报表1</el-button>
  153. </el-form-item>
  154. </el-form>
  155. </div>
  156. </div>
  157. <!-- 批次选择模态框 -->
  158. <!-- 育种场信息表格 -->
  159. <div class="farm-info-container">
  160. <table class="table table-bordered farm-info-table">
  161. <tbody>
  162. <tr>
  163. <th rowspan="3">{{ batchInfo.factoryName }}<br>日报表</th>
  164. <th>鸡场</th>
  165. <th class="important-cell">弥勒{{ batchInfo.factoryName }}</th>
  166. <th>批号</th>
  167. <th class="important-cell">{{ batchInfo.batchNum }}</th>
  168. <th>5%产蛋周龄</th>
  169. <th class="important-cell"></th>
  170. <th>育雏舍</th>
  171. <th class="important-cell"></th>
  172. </tr>
  173. <tr>
  174. <th>品种</th>
  175. <th class="important-cell">{{ batchInfo.lineage }}系</th>
  176. <th>栋号</th>
  177. <th class="important-cell">{{ batchInfo.coopNames }}</th>
  178. <th>母鸡进苗数</th>
  179. <th class="important-cell">{{ batchInfo.chickenCount1 }}</th>
  180. <th>育成舍</th>
  181. <th class="important-cell"></th>
  182. </tr>
  183. <tr>
  184. <th>来源</th>
  185. <th class="important-cell">{{ batchInfo.source }}</th>
  186. <th>进鸡日期</th>
  187. <th class="important-cell">{{ dayjs(batchInfo.hatchDate).format("YYYY年MM月DD日") }}</th>
  188. <th>公鸡进苗数</th>
  189. <th class="important-cell">{{ batchInfo.chickenCount0 }}</th>
  190. <th>产蛋舍</th>
  191. <th class="important-cell"></th>
  192. </tr>
  193. </tbody>
  194. </table>
  195. </div>
  196. <!-- 使用 Element Plus 的 el-table 替换原生表格 -->
  197. <div class="table-container">
  198. <el-table
  199. :data="reportDataItems"
  200. border
  201. :style="{ width: '100%' }"
  202. :height="600"
  203. :header-cell-style="{ backgroundColor: '#e6f0ff', color: '#2c5aa0', fontWeight: 600, textAlign: 'center', border: '1px solid #d0d7e0' } "
  204. :cell-style="{ border: '1px solid #d0d7e0', textAlign: 'center' }"
  205. highlight-current-row :native-scrollbar="true">
  206. <!-- 固定列:日期 -->
  207. <el-table-column prop="recordDate" label="日期" fixed width="100" :formatter="formatDate">
  208. </el-table-column>
  209. <!-- 周龄分组 -->
  210. <el-table-column label="周龄" fixed :colspan="3">
  211. <el-table-column prop="dayCount" label="天" width="60" ></el-table-column>
  212. <el-table-column prop="weekAge" label="生长周龄" width="80" ></el-table-column>
  213. <el-table-column prop="layingWeekAge" label="产蛋周龄" width="80" ></el-table-column>
  214. </el-table-column>
  215. <!-- 存栏鸡数分组 -->
  216. <el-table-column label="存栏鸡数" fixed :colspan="4">
  217. <el-table-column prop="chicken1Count" label="母鸡" width="80" ></el-table-column>
  218. <el-table-column prop="chicken0Count" label="公鸡" width="80" ></el-table-column>
  219. <el-table-column prop="chicken2Count" label="未知" width="80" ></el-table-column>
  220. <el-table-column prop="chickenCountTotal" label="合计" width="80" ></el-table-column>
  221. </el-table-column>
  222. <!-- 公母比例(%) - 固定列 -->
  223. <el-table-column prop="maleFemaleRatio" label="公母比例(%)" fixed width="80" ></el-table-column>
  224. <!-- 母鸡死淘分组 -->
  225. <el-table-column label="母鸡死淘" :colspan="7">
  226. <el-table-column label="母鸡死淘数量" :colspan="5">
  227. <el-table-column prop="death1" label="死亡" width="80"></el-table-column>
  228. <el-table-column prop="cull1" label="淘汰" width="80"></el-table-column>
  229. <el-table-column prop="packageCull1" label="打包淘汰" width="100"></el-table-column>
  230. <el-table-column prop="deathCullTotal1" label="合计" width="80"></el-table-column>
  231. <el-table-column prop="deathCullRate1" label="死淘率(%)" width="100"></el-table-column>
  232. </el-table-column>
  233. <el-table-column label="累计" :colspan="2">
  234. <el-table-column prop="accumCullTotal1" label="死淘" width="80"></el-table-column>
  235. <el-table-column prop="accumCullRate1" label="死淘率(%)" width="100"></el-table-column>
  236. </el-table-column>
  237. </el-table-column>
  238. <!-- 公鸡死淘分组 -->
  239. <el-table-column label="公鸡死淘" :colspan="7">
  240. <el-table-column label="公鸡死淘数量" :colspan="5">
  241. <el-table-column prop="death0" label="死亡" width="80"></el-table-column>
  242. <el-table-column prop="cull0" label="淘汰" width="80"></el-table-column>
  243. <el-table-column prop="packageCull0" label="打包淘汰" width="100"></el-table-column>
  244. <el-table-column prop="deathCullTotal0" label="合计" width="80"></el-table-column>
  245. <el-table-column prop="deathCullRate0" label="死淘率(%)" width="100"></el-table-column>
  246. </el-table-column>
  247. <el-table-column label="累计" :colspan="2">
  248. <el-table-column prop="accumCullTotal0" label="死淘" width="80"></el-table-column>
  249. <el-table-column prop="accumCullRate0" label="死淘率(%)" width="100"></el-table-column>
  250. </el-table-column>
  251. </el-table-column>
  252. <!-- 未知鸡死淘分组 -->
  253. <el-table-column label="未知鸡死淘" :colspan="7">
  254. <el-table-column label="未知死淘数量" :colspan="5">
  255. <el-table-column prop="death2" label="死亡" width="80"></el-table-column>
  256. <el-table-column prop="cull2" label="淘汰" width="80"></el-table-column>
  257. <el-table-column prop="packageCull2" label="打包淘汰" width="100"></el-table-column>
  258. <el-table-column prop="deathCullTotal2" label="合计" width="80"></el-table-column>
  259. <el-table-column prop="deathCullRate2" label="死淘率(%)" width="100"></el-table-column>
  260. </el-table-column>
  261. <el-table-column label="累计" :colspan="2">
  262. <el-table-column prop="accumCullTotal2" label="死淘" width="80"></el-table-column>
  263. <el-table-column prop="accumCullRate2" label="死淘率(%)" width="100"></el-table-column>
  264. </el-table-column>
  265. </el-table-column>
  266. <!-- 耗料分组 -->
  267. <el-table-column label="耗料" :colspan="17">
  268. <el-table-column label="耗料量(g)" :colspan="4">
  269. <el-table-column prop="poultDailyFeed1" label="母鸡" width="80"></el-table-column>
  270. <el-table-column prop="poultDailyFeed0" label="公鸡" width="80"></el-table-column>
  271. <el-table-column prop="poultDailyFeed2" label="未知" width="80"></el-table-column>
  272. <el-table-column label="合计" width="80">
  273. <template #default="scope">
  274. {{ (scope.row.poultDailyFeed0 || 0) + (scope.row.poultDailyFeed1 || 0) + (scope.row.poultDailyFeed2 || 0) }}
  275. </template>
  276. </el-table-column>
  277. </el-table-column>
  278. <el-table-column label="耗料量/只/日(g)" :colspan="3">
  279. <el-table-column prop="poultDailyFeedAvg1" label="母鸡" width="80"></el-table-column>
  280. <el-table-column prop="poultDailyFeedAvg0" label="公鸡" width="80"></el-table-column>
  281. <el-table-column prop="poultDailyFeedAvg2" label="未知" width="80"></el-table-column>
  282. </el-table-column>
  283. <el-table-column label="耗料量/只/日(g)" :colspan="3">
  284. <el-table-column prop="poultDailyFeedStandard1" label="母鸡" width="80"></el-table-column>
  285. <el-table-column prop="poultDailyFeedStandard0" label="公鸡" width="80"></el-table-column>
  286. <el-table-column prop="poultDailyFeedStandard2" label="未知" width="80"></el-table-column>
  287. </el-table-column>
  288. <el-table-column label="累计耗料量(g)" :colspan="4">
  289. <el-table-column prop="accumFeedAmount1" label="母鸡" width="80"></el-table-column>
  290. <el-table-column prop="accumFeedAmount0" label="公鸡" width="80"></el-table-column>
  291. <el-table-column prop="accumFeedAmount2" label="未知" width="80"></el-table-column>
  292. <el-table-column label="合计" width="80">
  293. <template #default="scope">
  294. {{ (scope.row.accumFeedAmount0 || 0) + (scope.row.accumFeedAmount1 || 0) + (scope.row.accumFeedAmount2 || 0) }}
  295. </template>
  296. </el-table-column>
  297. </el-table-column>
  298. <el-table-column prop="feed1" label="母鸡喂料种类" width="120"></el-table-column>
  299. <el-table-column prop="feed0" label="公鸡喂料种类" width="120"></el-table-column>
  300. <el-table-column prop="feed2" label="未知喂料种类" width="120"></el-table-column>
  301. </el-table-column>
  302. <!-- 日体重数据分组 -->
  303. <el-table-column label="日体重数据" :colspan="9">
  304. <el-table-column label="实际母鸡" :colspan="2">
  305. <el-table-column prop="weight1" label="体重" width="80"></el-table-column>
  306. <el-table-column prop="uniformity1" label="均匀度(%)" width="100"></el-table-column>
  307. </el-table-column>
  308. <el-table-column label="实际公鸡" :colspan="2">
  309. <el-table-column prop="weight0" label="体重" width="80"></el-table-column>
  310. <el-table-column prop="uniformity0" label="均匀度(%)" width="100"></el-table-column>
  311. </el-table-column>
  312. <el-table-column label="实际未知" :colspan="2">
  313. <el-table-column prop="weight2" label="体重" width="80"></el-table-column>
  314. <el-table-column prop="uniformity2" label="均匀度(%)" width="100"></el-table-column>
  315. </el-table-column>
  316. <el-table-column label="母系标准体重" :colspan="3">
  317. <el-table-column prop="standardWeight1" label="母鸡" width="80"></el-table-column>
  318. <el-table-column prop="standardWeight0" label="公鸡" width="80"></el-table-column>
  319. <el-table-column prop="standardWeight2" label="未知" width="80"></el-table-column>
  320. </el-table-column>
  321. </el-table-column>
  322. <!-- 产蛋情况分组 -->
  323. <el-table-column label="产蛋情况" :colspan="9">
  324. <el-table-column prop="totalEggs" label="总产蛋数" width="100"></el-table-column>
  325. <el-table-column prop="eggCount0" label="上缴种蛋" width="100"></el-table-column>
  326. <el-table-column label="商品蛋" :colspan="6">
  327. <el-table-column prop="eggCount1" label="纯系种蛋" width="100"></el-table-column>
  328. <el-table-column prop="eggCount2" label="祖代蛋" width="100"></el-table-column>
  329. <el-table-column prop="eggCount3" label="父母代蛋" width="100"></el-table-column>
  330. <el-table-column prop="eggCount4" label="菜蛋" width="100"></el-table-column>
  331. <el-table-column prop="eggCount5" label="畸形蛋" width="100"></el-table-column>
  332. <el-table-column prop="eggCount6" label="破蛋" width="100"></el-table-column>
  333. </el-table-column>
  334. <el-table-column prop="eggWeight" label="实际蛋重(g)" width="100"></el-table-column>
  335. </el-table-column>
  336. </el-table>
  337. </div>
  338. </div>
  339. <BatchModal ref="batchModalRef" :multiple="false" @confirm="onBatchConfirm" />
  340. </template>
  341. <style scoped>
  342. .table-container {
  343. overflow-x: auto;
  344. scrollbar-width: thin;
  345. scrollbar-color: #a0cfff #f1f1f1;
  346. border-radius: 8px;
  347. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
  348. margin: 20px 0;
  349. }
  350. .table {
  351. min-width: 100%;
  352. border-collapse: separate;
  353. border-spacing: 0;
  354. width: 100%;
  355. border-radius: 8px;
  356. overflow: hidden;
  357. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.03);
  358. }
  359. .table th,
  360. .table td {
  361. padding: 12px 15px;
  362. text-align: center;
  363. white-space: nowrap;
  364. border-right: 1px solid #d0d7e0;
  365. border-bottom: 1px solid #d0d7e0;
  366. }
  367. .table th {
  368. background-color: #e6f0ff;
  369. color: #2c5aa0;
  370. font-weight: 600;
  371. text-transform: uppercase;
  372. letter-spacing: 0.5px;
  373. font-size: 13px;
  374. /* 垂直居中对齐 */
  375. vertical-align: middle;
  376. }
  377. .table td {
  378. /* 垂直居中对齐 */
  379. vertical-align: middle;
  380. }
  381. .table th:last-child,
  382. .table td:last-child {
  383. border-right: none;
  384. }
  385. /* 斑马纹样式 */
  386. .table tbody tr:nth-child(even) {
  387. background-color: #fafcff;
  388. }
  389. /* 悬停效果 */
  390. .table tbody tr:hover {
  391. background-color: #f0f7ff;
  392. transition: background-color 0.2s ease;
  393. }
  394. /* 表头第一行特殊样式 */
  395. .table thead tr:first-child th {
  396. background-color: #d1e4ff;
  397. }
  398. /* 数字列右对齐 */
  399. .table td:nth-child(n+10) {
  400. text-align: right;
  401. }
  402. /* 育种场信息表格样式 */
  403. .farm-info-container {
  404. margin: 10px auto;
  405. border-radius: 8px;
  406. overflow: hidden;
  407. max-width: 1200px;
  408. width: 100%;
  409. }
  410. .farm-info-table {
  411. width: 100%;
  412. border-collapse: separate;
  413. border-spacing: 0;
  414. background-color: #ffffff;
  415. font-size: 13px;
  416. border:1px solid #d0d7e0;
  417. }
  418. .farm-info-table td {
  419. padding: 6px 10px;
  420. text-align: center;
  421. border-right: 1px solid #d0d7e0;
  422. border-bottom: 1px solid #d0d7e0;
  423. vertical-align: middle;
  424. }
  425. .farm-info-table td:last-child {
  426. border-right: none;
  427. }
  428. .farm-info-table tr:last-child td {
  429. border-bottom: none;
  430. }
  431. /* 合并单元格的背景色 */
  432. .farm-info-table td[rowspan],
  433. .farm-info-table td[colspan] {
  434. background-color: #fafdff;
  435. font-weight: 500;
  436. }
  437. /* 数据单元格的样式 */
  438. .farm-info-table td:not([rowspan]):not([colspan]) {
  439. background-color: #ffffff;
  440. text-align: center;
  441. }
  442. /* 需要从后端获取数据的列样式(实际第3、5、7、9列) */
  443. /* 第1行 */
  444. .important-cell {
  445. background-color: #fffefe !important;
  446. font-weight: 600;
  447. color: #3d4144 !important;
  448. border-radius: 4px;
  449. padding: 4px 8px;
  450. }
  451. </style>