index.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. <script setup>
  2. import {
  3. ref
  4. } from 'vue'
  5. import {
  6. onLoad,
  7. onPageScroll
  8. } from "@dcloudio/uni-app"
  9. import {
  10. timeFormat
  11. } from "@/utils/timeFormatter.js"
  12. import {
  13. getWeeklyByProject,
  14. getMonthlyByProject,
  15. getYearlyByProject
  16. } from "@/api/work/weeklyAndMonthly.js"
  17. let subId = ref(null);
  18. let subName = ref(null);
  19. let pageType = ref(null);
  20. let pageTypeText = ref(null);
  21. let pageForm = ref({
  22. startWeek: null,
  23. endWeek: null,
  24. startMonth: null,
  25. endMonth: null,
  26. year: null
  27. })
  28. let reportListWeekAndMonth = ref([])
  29. let reportListYear = ref([{
  30. name: "01",
  31. amt: null
  32. },
  33. {
  34. name: "02",
  35. amt: null
  36. },
  37. {
  38. name: "03",
  39. amt: null
  40. },
  41. {
  42. name: "04",
  43. amt: null
  44. },
  45. {
  46. name: "05",
  47. amt: null
  48. },
  49. {
  50. name: "06",
  51. amt: null
  52. },
  53. {
  54. name: "07",
  55. amt: null
  56. },
  57. {
  58. name: "08",
  59. amt: null
  60. },
  61. {
  62. name: "09",
  63. amt: null
  64. },
  65. {
  66. name: "10",
  67. amt: null
  68. },
  69. {
  70. name: "11",
  71. amt: null
  72. },
  73. {
  74. name: "12",
  75. amt: null
  76. },
  77. ])
  78. let showText = ref(null);
  79. // 根据类型修改页面内容
  80. function changeByReportKind(type) {
  81. // 修改页面标题
  82. const pageTypeTextObj = {
  83. "weekly": "项目周报",
  84. "monthly": "项目月报",
  85. "yearly": "项目年度计划"
  86. }
  87. pageTypeText.value = pageTypeTextObj[type]
  88. let now = new Date()
  89. // 根据不同类型初始化数据
  90. if (type === "weekly") {
  91. let nowFormat = timeFormat(now)
  92. endWeek.value = nowFormat
  93. pageForm.value.startWeek = getMondayToSunday(nowFormat)
  94. // // 结束时间
  95. // let nowFormat = timeFormat(now)
  96. // endWeek.value = nowFormat
  97. // pageForm.value.endWeek = getMondayToSunday(nowFormat)
  98. // // 开始时间
  99. // let start = now - 1000 * 60 * 60 * 24 * 30
  100. // let startFormat = timeFormat(start)
  101. // startWeek.value = startFormat
  102. // pageForm.value.startWeek = getMondayToSunday(startFormat)
  103. getWeekly();
  104. showText.value = "本周未填写周报"
  105. }
  106. if (type === "monthly") {
  107. let year = now.getFullYear();
  108. let month = now.getMonth() + 1 >= 10 ? now.getMonth() + 1 : '0' + (now.getMonth() + 1);
  109. // // 结束时间
  110. // let nowFormat = year + "/";
  111. // endMonth.value = nowFormat
  112. // pageForm.value.endMonth = nowFormat
  113. // 开始时间
  114. // let startFormat = year + "/01";
  115. let startFormat = year + "/" + month;
  116. startMonth.value = startFormat
  117. pageForm.value.startMonth = startFormat
  118. getMonthly()
  119. showText.value = "本月未填写月报"
  120. }
  121. if (type === "yearly") {
  122. let nowYear = now.getFullYear()
  123. pageForm.value.year = nowYear.toString()
  124. defaultIndex.value = [Number(nowYear) - 2000]
  125. getYearly()
  126. }
  127. }
  128. // 周报--切换
  129. const getWeeklyOther = function(type) {
  130. if (type === "next") {
  131. let end = pageForm.value.startWeek.substr(11);
  132. let Dms = new Date(end).getTime()
  133. const nextDay = new Date(Dms + 1000 * 60 * 60 * 24);
  134. let nowFormat = timeFormat(nextDay)
  135. pageForm.value.startWeek = getMondayToSunday(nowFormat);
  136. getWeekly();
  137. }
  138. if (type === "pre") {
  139. let start = pageForm.value.startWeek.substr(0, 10);
  140. let Dms = new Date(start).getTime()
  141. const preDay = new Date(Dms - 1000 * 60 * 60 * 24);
  142. let nowFormat = timeFormat(preDay)
  143. pageForm.value.startWeek = getMondayToSunday(nowFormat);
  144. getWeekly();
  145. }
  146. };
  147. // 周报--改变选择时间格式(周一至周天格式)
  148. function getMondayToSunday(date) {
  149. const chooseDay = new Date(date); // 选中的时间
  150. let nowTime = chooseDay.getTime(); // 选中的时间(时间戳化)
  151. let week = chooseDay.getDay() || 7; // 选中的是星期几
  152. let oneDayTime = 24 * 60 * 60 * 1000; // 一天的时间
  153. let mondayTime = nowTime - (week - 1) * oneDayTime; //周一
  154. let sundayTime = nowTime + (7 - week) * oneDayTime; //周日
  155. let mondayText = timeFormat(mondayTime); //周一文字化
  156. let sundayText = timeFormat(sundayTime); //周日文字化
  157. let mon1 = mondayText.replace("/", "-")
  158. let mon2 = mon1.replace("/", "-")
  159. let sun1 = sundayText.replace("/", "-")
  160. let sun2 = sun1.replace("/", "-")
  161. return mon2 + "至" + sun2
  162. }
  163. // 周报====================================选择开始时间
  164. let startWeek = ref(null)
  165. let beginTimeShowWeek = ref(false)
  166. function showBeginTimeChooseWeekly() {
  167. beginTimeShowWeek.value = true
  168. }
  169. function beginTimeCloseWeek(e) {
  170. if (e) {
  171. let time = timeFormat(e.value)
  172. pageForm.value.startWeek = getMondayToSunday(time)
  173. }
  174. beginTimeShowWeek.value = false
  175. getWeekly();
  176. }
  177. // 周报====================================选择结束时间
  178. let endWeek = ref(null)
  179. let endTimeShowWeek = ref(false)
  180. function showEndTimeChooseWeekly() {
  181. endTimeShowWeek.value = true
  182. }
  183. function endTimeCloseWeek(e) {
  184. if (e) {
  185. let time = timeFormat(e.value)
  186. pageForm.value.endWeek = getMondayToSunday(time)
  187. }
  188. endTimeShowWeek.value = false;
  189. getWeekly();
  190. }
  191. // 周报====================================请求数据
  192. function getWeekly() {
  193. let params = {
  194. subId: subId.value,
  195. beginDate: pageForm.value.startWeek.substr(0, 10),
  196. endDate: pageForm.value.startWeek.substr(11)
  197. }
  198. getWeeklyByProject(params).then(res => {
  199. reportListWeekAndMonth.value = res.data.list
  200. })
  201. }
  202. // 月报====================================选择开始时间
  203. let startMonth = ref(null)
  204. let beginTimeShow = ref(false)
  205. function showBeginTimeChooseMonth() {
  206. beginTimeShow.value = true
  207. }
  208. function beginTimeClose(e) {
  209. if (e) {
  210. let time = timeFormat(e.value)
  211. time = time.substring(0, 7)
  212. pageForm.value.startMonth = time
  213. }
  214. beginTimeShow.value = false
  215. getMonthly()
  216. }
  217. // 月报====================================选择结束时间
  218. let endMonth = ref(null)
  219. let endTimeShow = ref(false)
  220. function showEndTimeChoose() {
  221. endTimeShow.value = true
  222. }
  223. function endTimeClose(e) {
  224. if (e) {
  225. let time = timeFormat(e.value)
  226. time = time.substring(0, 7)
  227. pageForm.value.endMonth = time
  228. }
  229. endTimeShow.value = false
  230. getMonthly()
  231. }
  232. // 月报--切换
  233. const getMonthOther = function(type) {
  234. if (type === "next") {
  235. let time = pageForm.value.startMonth;
  236. let year = pageForm.value.startMonth.substr(0, 4);
  237. let month = pageForm.value.startMonth.substr(5);
  238. let dayNum = 0;
  239. if (month === "1" || month === "3" || month === "5" || month === "7" || month === "8" || month === "10" ||
  240. month === "12") {
  241. dayNum = 32;
  242. } else if (month === "2") {
  243. // 闰月
  244. if (year % 4 === 0 && year % 100 !== 0) {
  245. dayNum = 30;
  246. } else {
  247. dayNum = 29;
  248. }
  249. } else {
  250. dayNum = 31;
  251. }
  252. let Dms = new Date(time).getTime();
  253. let nextMonth = new Date(Dms + 1000 * 60 * 60 * 24 * dayNum);
  254. let nextFormat = timeFormat(nextMonth);
  255. pageForm.value.startMonth = nextFormat.substr(0, 7);
  256. getMonthly()
  257. }
  258. if (type === "pre") {
  259. let time = pageForm.value.startMonth;
  260. let month = pageForm.value.startMonth.substr(5);
  261. let Dms = new Date(time).getTime();
  262. let preMonth = new Date(Dms - 1000 * 60 * 60 * 24);
  263. let preFormat = timeFormat(preMonth);
  264. pageForm.value.startMonth = preFormat.substr(0, 7);
  265. getMonthly()
  266. }
  267. };
  268. // 月报====================================请求数据
  269. function getMonthly() {
  270. let start01 = pageForm.value.startMonth.replace('/', '-')
  271. let start02 = start01.replace('/', '-') + '-01'
  272. // let end01 = pageForm.value.endMonth.replace('/', '-')
  273. // let end02 = end01.replace('/', '-') + '-01'
  274. let params = {
  275. subId: subId.value,
  276. beginDate: start02,
  277. endDate: start02
  278. }
  279. getMonthlyByProject(params).then(res => {
  280. res.data.list.forEach(item => {
  281. item.editMonth = item.kjMonth.slice(0, 4) + "年" + item.kjMonth.slice(4, 6) + "月"
  282. })
  283. reportListWeekAndMonth.value = res.data.list
  284. })
  285. }
  286. // 年度计划====================================选择年
  287. let defaultIndex = ref([0])
  288. let yearShow = ref(false);
  289. let yearColumns = ref([
  290. ["2000", "2001", "2002", "2003", "2004", "2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013",
  291. "2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025", "2026",
  292. "2027", "2028", "2029", "2030", "2031", "2032", "2033"
  293. ]
  294. ])
  295. function yearShowChoose() {
  296. yearShow.value = true;
  297. }
  298. function yearClose(e) {
  299. if (e) pageForm.value.year = e.value[0];
  300. yearShow.value = false
  301. getYearly()
  302. }
  303. // 年度计划====================================请求数据
  304. function getYearly() {
  305. let params = {
  306. subId: subId.value,
  307. year: pageForm.value.year
  308. }
  309. getYearlyByProject(params).then(res => {
  310. reportListYear.value = res.data.list
  311. })
  312. }
  313. onLoad(options => {
  314. pageType.value = options.type
  315. subId.value = options.subId
  316. subName.value = options.subName
  317. changeByReportKind(options.type)
  318. })
  319. </script>
  320. <template>
  321. <view class="container">
  322. <page-title>{{pageTypeText || "项目报告"}}</page-title>
  323. <view class="cards-list">
  324. <view class="card only-card">
  325. <view class="card-item first-card-item">
  326. <view class="card-item-name">项目名称</view>
  327. <view class="card-item-input">{{subName || "--"}}</view>
  328. </view>
  329. <!-- 周报-周显示 -->
  330. <view class="card-item" v-if="pageType === 'weekly'">
  331. <view class="card-item-name">时间范围</view>
  332. <view class="card-item-description">
  333. <view>{{pageForm.startWeek}}</view>
  334. </view>
  335. </view>
  336. <view class="card-item" v-if="pageType === 'weekly'">
  337. <view class="card-btn" @click="getWeeklyOther('pre')">上一周</view>
  338. <view class="card-btn" @click="getWeeklyOther('next')">下一周</view>
  339. </view>
  340. <!-- 周报-开始周 -->
  341. <!-- <view class="card-item" v-if="pageType === 'weekly'">
  342. <view class="card-item-name">开始周</view>
  343. <view class="card-item-description" @click="showBeginTimeChooseWeekly()">
  344. <view>{{pageForm.startWeek}}</view>
  345. <u-icon name="arrow-right" color="#343437" size="16" customStyle="margin-left:10rpx"></u-icon>
  346. </view>
  347. </view>
  348. -->
  349. <!-- 周报-结束周 -->
  350. <!-- <view class="card-item" v-if="pageType === 'weekly'">
  351. <view class="card-item-name">结束周</view>
  352. <view class="card-item-description" @click="showEndTimeChooseWeekly()">
  353. <view>{{pageForm.endWeek}}</view>
  354. <u-icon name="arrow-right" color="#343437" size="16" customStyle="margin-left:10rpx"></u-icon>
  355. </view>
  356. </view> -->
  357. <!-- 月报-月显示 -->
  358. <view class="card-item" v-if="pageType === 'monthly'">
  359. <view class="card-item-name">月报时间</view>
  360. <view class="card-item-description">
  361. <view>{{pageForm.startMonth}}</view>
  362. </view>
  363. </view>
  364. <view class="card-item" v-if="pageType === 'monthly'">
  365. <view class="card-btn" @click="getMonthOther('pre')">上一月</view>
  366. <view class="card-btn" @click="getMonthOther('next')">下一月</view>
  367. </view>
  368. <!-- 月报-开始月 -->
  369. <!-- <view class="card-item" v-if="pageType === 'monthly'">
  370. <view class="card-item-name">开始月</view>
  371. <view class="card-item-description" @click="showBeginTimeChooseMonth()">
  372. <view>{{pageForm.startMonth}}</view>
  373. <u-icon name="arrow-right" color="#343437" size="16" customStyle="margin-left:10rpx"></u-icon>
  374. </view>
  375. </view> -->
  376. <!-- 月报-结束月 -->
  377. <!-- <view class="card-item" v-if="pageType === 'monthly'">
  378. <view class="card-item-name">结束月</view>
  379. <view class="card-item-description" @click="showEndTimeChoose()">
  380. <view>{{pageForm.endMonth}}</view>
  381. <u-icon name="arrow-right" color="#343437" size="16" customStyle="margin-left:10rpx"></u-icon>
  382. </view>
  383. </view> -->
  384. <!-- 年度计划 -->
  385. <view class="card-item" v-if="pageType === 'yearly'">
  386. <view class="card-item-name">年度</view>
  387. <view class="card-item-description" @click="yearShowChoose()">
  388. <view v-if="pageForm.year">{{pageForm.year}}</view>
  389. <view v-else class="remind-text">请选择年度</view>
  390. <u-icon name="arrow-right" color="#343437" size="16" customStyle="margin-left:10rpx"></u-icon>
  391. </view>
  392. </view>
  393. </view>
  394. <view class="card" style="padding-top: 40rpx;" v-for="(item,index) in reportListWeekAndMonth" :key="index">
  395. <!-- 录入周期 -->
  396. <view class="card-item first-card-item" v-if="pageType === 'weekly'">
  397. <view class="card-item-name">录入周期</view>
  398. <view class="card-item-input">{{item.kjMonth || "--"}}</view>
  399. </view>
  400. <!-- 录入年月 -->
  401. <view class="card-item first-card-item" v-if="pageType === 'monthly'">
  402. <view class="card-item-name">录入年月</view>
  403. <view class="card-item-input">{{item.editMonth || "--"}}</view>
  404. </view>
  405. <!-- 资金使用 -->
  406. <view class="card-item" v-if="pageType === 'monthly'">
  407. <view class="card-item-name">资金使用</view>
  408. <view class="card-item-input">{{item.amt || "--"}}万元</view>
  409. </view>
  410. <!-- 项目进展情况 -->
  411. <view class="card-item" v-if="pageType === 'weekly'">
  412. <view class="card-item-name">项目进展情况</view>
  413. </view>
  414. <view class="card-item" v-if="pageType === 'weekly'">
  415. <u--textarea class="card-item-textarea" v-model="item.content" disabled></u--textarea>
  416. </view>
  417. <!-- 项目延期原因 -->
  418. <view class="card-item">
  419. <view class="card-item-name">项目延期原因</view>
  420. </view>
  421. <view class="card-item">
  422. <u--textarea class="card-item-textarea" v-model="item.reason" disabled></u--textarea>
  423. </view>
  424. <!-- 进度 -->
  425. <view class="card-item">
  426. <view class="card-item-name">进度</view>
  427. <view class="card-item-input">{{item.numBl || "--"}}%</view>
  428. </view>
  429. <!-- 当月完成内容 -->
  430. <view class="card-item" v-if="pageType === 'monthly'">
  431. <view class="card-item-name">当月完成内容</view>
  432. </view>
  433. <view class="card-item" v-if="pageType === 'monthly'">
  434. <u--textarea class="card-item-textarea" v-model="item.content" disabled></u--textarea>
  435. </view>
  436. <!-- 下月预测投资金额 -->
  437. <view class="card-item" v-if="pageType === 'monthly'">
  438. <view class="card-item-name" style="min-width: 256rpx;">下月预测投资金额</view>
  439. <view class="card-item-input">{{item.amtLast || "--"}}(万元)</view>
  440. </view>
  441. </view>
  442. <view class="card" style="padding-top: 40rpx;" v-if="pageType==='yearly'">
  443. <view class="card-name first-card-item">
  444. <view class="card-name-title">
  445. <text class="card-name-description">月份</text>
  446. </view>
  447. <view class="card-name-title">
  448. <text class="card-name-description">资金(万元)</text>
  449. </view>
  450. </view>
  451. <!-- 月份值 -->
  452. <view class="card-item" v-for="(item,index) in reportListYear" :key="index">
  453. <view class="card-item-name">{{item.ymonth}}</view>
  454. <view class="card-item-input">
  455. <text class="card-name-description">{{item.amt || "--"}}</text>
  456. </view>
  457. <!-- <input v-model="item.amt" type="number" class="card-item-input" placeholder="请填写金额"
  458. placeholder-style="color: #D8D8D8" maxlength="20" /> -->
  459. </view>
  460. </view>
  461. <empty-show v-if="pageType!=='yearly'&& reportListWeekAndMonth.length===0" heightPrecent="30%"
  462. :showText="showText" size='60rpx'></empty-show>
  463. </view>
  464. <!-- 周报--开始时间 -->
  465. <u-datetime-picker :show="beginTimeShowWeek" @confirm="beginTimeCloseWeek" @cancel="beginTimeCloseWeek"
  466. @close="beginTimeCloseWeek" v-model="startWeek" mode="date" closeOnClickOverlay></u-datetime-picker>
  467. <!-- 周报--结束时间 -->
  468. <u-datetime-picker :show="endTimeShowWeek" @confirm="endTimeCloseWeek" @cancel="endTimeCloseWeek"
  469. @close="endTimeCloseWeek" v-model="endWeek" mode="date" closeOnClickOverlay></u-datetime-picker>
  470. <!-- 月报--开始时间 -->
  471. <u-datetime-picker :show="beginTimeShow" @confirm="beginTimeClose" @cancel="beginTimeClose" @close="beginTimeClose"
  472. v-model="startMonth" mode="year-month" closeOnClickOverlay></u-datetime-picker>
  473. <!-- 月报--结束时间 -->
  474. <u-datetime-picker :show="endTimeShow" @confirm="endTimeClose" @cancel="endTimeClose" @close="endTimeClose"
  475. v-model="endMonth" mode="year-month" closeOnClickOverlay></u-datetime-picker>
  476. <!-- 年度选择 -->
  477. <u-picker :show="yearShow" :defaultIndex="defaultIndex" :columns="yearColumns" @confirm="yearClose"
  478. @cancel="yearClose" @close="yearClose" closeOnClickOverlay></u-picker>
  479. </view>
  480. </template>
  481. <style lang="scss" scoped>
  482. </style>