混凝土运输管理微信小程序、替班
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

382 lines
9.2 KiB

2 weeks ago
  1. <template>
  2. <view class="content">
  3. <navbar title="完工确认" leftClick @leftClick="$utils.navigateBack" />
  4. <view class="cr mt40">
  5. <!-- 计时结束照片 -->
  6. <view class="re-card-p32">
  7. <view class="flex-sb">
  8. <view class="re-from-label">请拍摄计时结束照片</view>
  9. <view class="re-card-show" @click="clickShowExample('https://relief.oss-cn-hangzhou.aliyuncs.com/one19.png')">查看示例</view>
  10. </view>
  11. <input-image
  12. :height="456"
  13. @uploadSuccess="(data) => form.timingEnd = data.ossUrl"
  14. />
  15. <view class="re-card-context">
  16. 需拍摄<label>计时结束计时</label>照片以保证您的利益
  17. </view>
  18. </view>
  19. <!-- 抖料清洗照片 -->
  20. <view class="re-card-p32">
  21. <view class="flex-sb">
  22. <view class="re-from-label">请拍摄抖料清洗照片</view>
  23. <view class="re-card-show" @click="clickShowExample('https://relief.oss-cn-hangzhou.aliyuncs.com/one17.png')">查看示例</view>
  24. </view>
  25. <input-image
  26. :height="456"
  27. @uploadSuccess="(data) => form.materialCleaning = data.ossUrl"
  28. />
  29. <view class="re-card-context">
  30. 需拍摄<label>抖料清洗</label>照片
  31. </view>
  32. </view>
  33. <!-- 车身照片 -->
  34. <view class="re-card-p32">
  35. <view class="flex-sb">
  36. <view class="re-from-label">请拍摄车身照片</view>
  37. <view class="re-card-show" @click="clickShowExample('https://relief.oss-cn-hangzhou.aliyuncs.com/one19.png')">查看示例</view>
  38. </view>
  39. <input-image
  40. :height="456"
  41. @uploadSuccess="(data) => form.vehicleBody = data.ossUrl"
  42. />
  43. <view class="re-card-context">
  44. 需拍摄<label>车身照片</label>照片以保证您的利益
  45. </view>
  46. </view>
  47. <!-- 仪表盘照片 -->
  48. <view class="re-card-p32">
  49. <view class="flex-sb">
  50. <view class="re-from-label">请拍摄仪表盘照片</view>
  51. <view class="re-card-show" @click="clickShowExample('https://relief.oss-cn-hangzhou.aliyuncs.com/one01.png')">查看示例</view>
  52. </view>
  53. <input-image
  54. :height="456"
  55. @uploadSuccess="(data) => form.dashboard = data.ossUrl"
  56. />
  57. <view class="re-card-context">
  58. 需拍摄<label>仪表盘</label>照片<label>数值清晰无倾斜</label>以保证您的利益
  59. </view>
  60. </view>
  61. <!-- 签单照片 -->
  62. <view class="re-card-p32">
  63. <view class="flex-sb">
  64. <view class="re-from-label">请拍摄签单照片</view>
  65. <view class="re-card-show" @click="clickShowExample('https://relief.oss-cn-hangzhou.aliyuncs.com/one16.png')">查看示例</view>
  66. </view>
  67. <input-image
  68. :height="456"
  69. @uploadSuccess="(data) => form.signedOrder = data.ossUrl"
  70. />
  71. <view class="re-card-context">
  72. 需拍摄<label>签单</label>照片尽量保证<label>字体不倾斜文字清晰</label>以保证您的后续利益
  73. </view>
  74. </view>
  75. <!-- 补方小票照片 -->
  76. <view class="re-card-p32">
  77. <view class="flex-sb">
  78. <view class="re-from-label">请拍摄补方小票照片</view>
  79. <view class="re-card-show" @click="clickShowExample('https://relief.oss-cn-hangzhou.aliyuncs.com/one16.png')">查看示例</view>
  80. </view>
  81. <input-image
  82. :height="456"
  83. @uploadSuccess="(data) => form.supplementTicket = data.ossUrl"
  84. />
  85. <view class="re-card-context">
  86. 需拍摄补方小票照片<label>请保证字迹清晰图片完整</label>照片以保证您的利益
  87. </view>
  88. </view>
  89. <!-- 车辆入库交车照片 -->
  90. <view class="re-card-p32">
  91. <view class="flex-sb">
  92. <view class="re-from-label">请拍摄车辆入库交车照片</view>
  93. <view class="re-card-show" @click="clickShowExample('https://relief.oss-cn-hangzhou.aliyuncs.com/one18.png')">查看示例</view>
  94. </view>
  95. <input-image
  96. :height="456"
  97. @uploadSuccess="(data) => form.vehicleHandover = data.ossUrl"
  98. />
  99. <view class="re-card-context">
  100. 需拍摄<label>车辆入库交车照片</label>以保证您的利益
  101. </view>
  102. </view>
  103. <!-- 备注 -->
  104. <view class="re-card-p32">
  105. <view class="re-from-label">备注<label>选填</label></view>
  106. <textarea
  107. class="re-card-textarea"
  108. placeholder=" 如在施工过程中发现问题,请用文字描述。"
  109. v-model="form.remark"
  110. />
  111. </view>
  112. </view>
  113. <!-- 底部提交按钮 -->
  114. <view class="re-end-pand">
  115. <button @click="submitForm">提交保存</button>
  116. </view>
  117. <!-- 示例弹窗 -->
  118. <show-example
  119. v-if="showExample"
  120. :show="showExample"
  121. :url="exampleUrl"
  122. @close="showExample = false"
  123. />
  124. </view>
  125. </template>
  126. <script>
  127. import navbar from '@/components/base/navbar.vue'
  128. import InputImage from '@/components/base/input-image.vue'
  129. import ShowExample from '@/components/base/show-example.vue'
  130. export default {
  131. name: 'UserStep2',
  132. components: {
  133. navbar,
  134. InputImage,
  135. ShowExample
  136. },
  137. data() {
  138. return {
  139. orderId: '',
  140. showExample: false,
  141. exampleUrl: '',
  142. form: {
  143. timingEnd: '', // 计时结束照片
  144. materialCleaning: '', // 抖料清洗照片
  145. vehicleBody: '', // 车身照片
  146. dashboard: '', // 仪表盘照片
  147. signedOrder: '', // 签单照片
  148. supplementTicket: '', // 补方小票照片
  149. vehicleHandover: '', // 车辆入库交车照片
  150. remark: '' // 备注
  151. }
  152. }
  153. },
  154. onLoad(options) {
  155. if (options.id) {
  156. this.orderId = options.id;
  157. }
  158. },
  159. methods: {
  160. // 显示示例图片
  161. clickShowExample(url) {
  162. this.exampleUrl = url || 'https://relief.oss-cn-hangzhou.aliyuncs.com/yx.jpg';
  163. this.showExample = true;
  164. },
  165. // 提交表单
  166. submitForm() {
  167. // 验证必填项
  168. const requiredFields = [
  169. 'timingEnd', 'materialCleaning', 'vehicleBody', 'dashboard',
  170. 'signedOrder', 'supplementTicket', 'vehicleHandover'
  171. ];
  172. for (let field of requiredFields) {
  173. if (!this.form[field]) {
  174. uni.showToast({
  175. icon: 'none',
  176. title: '请按照要求拍摄上传照片'
  177. });
  178. return;
  179. }
  180. }
  181. this.doSubmit();
  182. },
  183. // 执行提交
  184. doSubmit() {
  185. // 模拟提交数据
  186. const submitData = {
  187. id: this.$utils?.generateUUID() || Date.now().toString(),
  188. status: 2,
  189. step: 3,
  190. orderId: this.orderId,
  191. ...this.form
  192. };
  193. console.log('提交数据:', submitData);
  194. // 模拟API调用
  195. uni.showLoading({
  196. title: '提交中...'
  197. });
  198. setTimeout(() => {
  199. uni.hideLoading();
  200. uni.showToast({
  201. icon: 'success',
  202. title: '提交成功'
  203. });
  204. setTimeout(() => {
  205. uni.navigateBack({
  206. delta: 1
  207. });
  208. }, 1500);
  209. }, 1000);
  210. }
  211. }
  212. }
  213. </script>
  214. <style scoped lang="scss">
  215. page {
  216. background-color: #F5F5F5;
  217. }
  218. .content {
  219. min-height: 100vh;
  220. background-color: #F5F5F5;
  221. padding-bottom: 200rpx; // 为底部按钮留出空间
  222. }
  223. .cr {
  224. min-height: calc(88vh);
  225. }
  226. .mt40 {
  227. margin-top: 40rpx;
  228. }
  229. // 卡片样式
  230. .re-card-p32 {
  231. background-color: #FFFFFF;
  232. border-radius: 20rpx;
  233. width: calc(690rpx - 64rpx);
  234. min-height: 120rpx;
  235. margin: 0 calc(50vw - 690rpx / 2);
  236. margin-bottom: 30rpx;
  237. padding: 32rpx;
  238. position: relative;
  239. box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
  240. }
  241. // 弹性布局
  242. .flex-sb {
  243. display: flex;
  244. justify-content: space-between;
  245. align-items: center;
  246. margin-bottom: 24rpx;
  247. }
  248. // 标签样式
  249. .re-from-label {
  250. font-size: 28rpx;
  251. font-weight: normal;
  252. letter-spacing: 0px;
  253. color: #1c1c1c;
  254. }
  255. // 查看示例按钮
  256. .re-card-show {
  257. color: #9E9E9E;
  258. font-size: 24rpx;
  259. font-weight: normal;
  260. line-height: normal;
  261. letter-spacing: 0em;
  262. padding: 8rpx 16rpx;
  263. border: 1rpx solid #9E9E9E;
  264. border-radius: 20rpx;
  265. background-color: rgba(158, 158, 158, 0.1);
  266. transition: all 0.3s;
  267. &:active {
  268. background-color: rgba(158, 158, 158, 0.2);
  269. transform: scale(0.95);
  270. }
  271. }
  272. // 说明文字
  273. .re-card-context {
  274. font-size: 24rpx;
  275. font-weight: normal;
  276. line-height: 36rpx;
  277. letter-spacing: 0em;
  278. color: #9E9E9E;
  279. margin-top: 16rpx;
  280. label {
  281. color: #F40000;
  282. font-weight: 500;
  283. }
  284. }
  285. // 文本域样式
  286. .re-card-textarea {
  287. width: 570rpx;
  288. height: 152rpx;
  289. border-radius: 8rpx;
  290. padding: 20rpx;
  291. background: #EEEEEE;
  292. font-size: 26rpx;
  293. line-height: normal;
  294. letter-spacing: 0em;
  295. color: #0d0d0d;
  296. border: none;
  297. box-sizing: border-box;
  298. resize: none;
  299. &::placeholder {
  300. color: #999;
  301. }
  302. }
  303. // 底部按钮区域
  304. .re-end-pand {
  305. position: fixed;
  306. bottom: 0;
  307. left: 0;
  308. right: 0;
  309. width: 100vw;
  310. height: 88rpx;
  311. opacity: 1;
  312. background: #FFFFFF;
  313. box-shadow: 0rpx 2rpx 20rpx 0rpx rgba(0, 0, 0, 0.2);
  314. padding: 30rpx 0;
  315. padding-bottom: calc(30rpx + env(safe-area-inset-bottom));
  316. z-index: 100;
  317. button {
  318. width: 620rpx;
  319. height: 88rpx;
  320. line-height: 88rpx;
  321. border-radius: 10rpx;
  322. background: #F40000;
  323. color: #FFF;
  324. text-align: center;
  325. margin: 0 auto;
  326. font-size: 30rpx;
  327. font-weight: 400;
  328. transition: all 0.2s ease-in-out;
  329. border: none;
  330. &:active {
  331. transform: translateY(2rpx) translateX(1rpx);
  332. background: #d63031;
  333. }
  334. }
  335. }
  336. // 高亮文字
  337. .highlight {
  338. color: #F40000;
  339. font-weight: 500;
  340. }
  341. // 可选标识
  342. .optional {
  343. color: #999;
  344. font-weight: normal;
  345. }
  346. </style>