OrderItems.vue 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. <template>
  2. <div class="container">
  3. <el-alert type="warning"
  4. :title="type+'项目条目'"
  5. :closable="false" show-icon style="margin-bottom: 15px"></el-alert>
  6. <el-tabs>
  7. <el-tab-pane label="图表">
  8. <el-divider>标准配置</el-divider>
  9. <el-row :gutter="24" type="flex" style="flex-wrap: wrap; flex-direction: row">
  10. <el-col :span="12" v-for="(item, index) in baseDevice" :key="item.id">
  11. <el-card shadow="always">
  12. <div slot="header" class="clearfix">
  13. <el-link @click="() => { $router.push({ path: `/pj/pj-goods-detail/${item.good_id}` }) }">{{ item.name }}</el-link>
  14. <el-button v-if="boolFounder" size="mini" @click="changeEdit(item)">修改</el-button>
  15. </div>
  16. <div>
  17. <div class="param-item">
  18. <div class="image">
  19. <el-link @click="() => { $router.push({ path: `/pj/pj-goods-detail/${item.good_id}` }) }">
  20. <img :src="item.image">
  21. </el-link>
  22. </div>
  23. <div class="info">
  24. <div>生产型号:{{ item.code }}</div>
  25. <div>产品编码:{{ item.no }}</div>
  26. <div>产品类型:{{ item.good_type }}</div>
  27. <div>生产周期:{{ item.produce_day }}天</div>
  28. <div v-if="boolFounder">数量:<el-input-number v-model="item.qty"/><el-button @click="handleSave(item)">保存</el-button></div>
  29. <div v-else>数量:{{item.qty}}</div>
  30. <div v-if="boolFounder || permissions.filter(p => p === 'draftEdit' || p === 'pjReceipt').length > 0">价格:{{item.price}}</div>
  31. </div>
  32. </div>
  33. <el-tooltip class="item" effect="dark" :content="item.sales_remark" placement="top">
  34. <div class="myFont"><span style="font-size: 11px">{{ item.sales_remark }}</span></div>
  35. </el-tooltip>
  36. <el-row>
  37. <el-col :span="12">
  38. <template v-if="boolFounder || permissions.filter(p => p === 'pjTech' || p === 'pjOrderItemsList').length > 0">
  39. <el-divider>技术:
  40. <el-button type="text" icon="el-icon-edit-outline" @click="handleTechSave(item)">保存</el-button>
  41. </el-divider>
  42. <div class="tech_panel">
  43. <div class="myFont">填写人:
  44. <el-tooltip class="item" effect="dark" :content="item.tech_name" placement="top">
  45. <span style="font-size: 11px">{{item.tech_name}}</span>
  46. </el-tooltip>
  47. </div>
  48. <div class="myFont">填写时间:
  49. <el-tooltip class="item" effect="dark" :content="item.tech_time" placement="top">
  50. <span style="font-size: 11px">{{ item.tech_time }}</span>
  51. </el-tooltip>
  52. </div>
  53. <div>硬件版本:<el-input v-model="item.hard_ver" size="small"></el-input></div>
  54. <div>软件版本:<el-input v-model="item.soft_ver" size="small"></el-input></div>
  55. <div>备注:<el-input type="textarea" rows="3" placeholder="备注,最大150字" maxlength="150" show-word-limit v-model="item.tech_remark"></el-input></div>
  56. <div @click="clickImg(index, 1)">
  57. <el-upload :action="`${MixinUploadApi}?scene=pjorders`" :file-list="getImg(item.name, item.tech_img)" :on-preview="handlePictureCardPreview" :before-upload="beforeAvatarUpload"
  58. :on-success="handleImageSuccess" :on-remove="handleRemove" :on-exceed="handleExceed" :limit="1">
  59. <el-button v-if="!item.tech_img" size="small" type="primary">点击上传</el-button>
  60. </el-upload>
  61. </div>
  62. </div>
  63. </template>
  64. <template v-else>
  65. <el-divider>技术:</el-divider>
  66. <div class="tech_panel myFont">
  67. <div class="">填写人:
  68. <el-tooltip class="item" effect="dark" :content="item.tech_name" placement="top">
  69. <span style="font-size: 11px">{{item.tech_name}}</span>
  70. </el-tooltip>
  71. </div>
  72. <div>填写时间:
  73. <el-tooltip class="item" effect="dark" :content="item.tech_time" placement="top">
  74. <span style="font-size: 11px">{{ item.tech_time }}</span>
  75. </el-tooltip>
  76. </div>
  77. <div>硬件版本:<el-tooltip class="item" effect="dark" :content="item.hard_ver" placement="top">
  78. <span style="font-size: 11px">{{item.hard_ver}}</span>
  79. </el-tooltip>
  80. </div>
  81. <div>软件版本:<el-tooltip class="item" effect="dark" :content="item.soft_ver" placement="top">
  82. <span style="font-size: 11px">{{item.soft_ver}}</span>
  83. </el-tooltip></div>
  84. <div>备注:<el-tooltip class="item" effect="dark" :content="item.tech_remark" placement="top">
  85. <span style="font-size: 11px">{{item.tech_remark}}</span>
  86. </el-tooltip></div>
  87. <div v-if="item.tech_img">
  88. <el-upload :action="`${MixinUploadApi}?scene=pjorders`" :file-list="getImg(item.name, item.tech_img)" :on-preview="handlePictureCardPreview" :before-upload="beforeAvatarUpload"
  89. :on-success="handleImageSuccess" :on-remove="handleRemove" :on-exceed="handleExceed" disabled:limit="1">
  90. </el-upload>
  91. </div>
  92. </div>
  93. </template>
  94. </el-col>
  95. <el-col :span="12">
  96. <template v-if="boolFounder || permissions.filter(p => p === 'pjOrderItemsList').length > 0">
  97. <el-divider>生产:
  98. <el-button type="text" icon="el-icon-edit-outline" @click="handleProduceSave(item)">保存</el-button>
  99. </el-divider>
  100. <div class="tech_panel">
  101. <div class="myFont">填写人:
  102. <el-tooltip class="item" effect="dark" :content="item.produce_name" placement="top">
  103. <span style="font-size: 11px">{{item.produce_name}}</span>
  104. </el-tooltip>
  105. </div>
  106. <div class="myFont">填写时间:
  107. <el-tooltip class="item" effect="dark" :content="item.produce_time" placement="top">
  108. <span style="font-size: 11px">{{ item.produce_time }}</span>
  109. </el-tooltip>
  110. </div>
  111. <div>已产量:<el-input v-model="item.produced_qty"><template slot="append">共{{item.qty}}</template></el-input></div>
  112. <div>发货量:<el-input v-model="item.shipped_qty" /></div>
  113. <div>备注:
  114. <el-input type="textarea" rows="3" placeholder="备注,最大150字" maxlength="150" show-word-limit v-model="item.produced_remark"></el-input>
  115. </div>
  116. <div>生产状态:
  117. <el-select placeholder="请选择" slot="prepend" v-model="item.produce_status">
  118. <el-option value="采购原料中"></el-option>
  119. <el-option value="生产中"></el-option>
  120. <el-option value="完成"></el-option>
  121. </el-select>
  122. </div>
  123. <div @click="clickImg(index, 2)">
  124. <el-upload :action="`${MixinUploadApi}?scene=pjorders`" :file-list="getImg(item.name, item.produce_img)" :on-preview="handlePictureCardPreview" :before-upload="beforeAvatarUpload"
  125. :on-success="handleImageSuccess" :on-remove="handleRemove" :on-exceed="handleExceed" :limit="1">
  126. <el-button v-if="!item.produce_img" size="small" type="primary">点击上传</el-button>
  127. </el-upload>
  128. </div>
  129. </div>
  130. </template>
  131. <template v-else>
  132. <el-divider>生产情况</el-divider>
  133. <div class="tech_panel myFont">
  134. <div>填写人:
  135. <el-tooltip class="item" effect="dark" :content="item.produce_name" placement="top">
  136. <span style="font-size: 11px">{{item.produce_name}}</span>
  137. </el-tooltip>
  138. </div>
  139. <div>填写时间:
  140. <el-tooltip class="item" effect="dark" :content="item.produce_time" placement="top">
  141. <span style="font-size: 11px">{{ item.produce_time }}</span>
  142. </el-tooltip>
  143. </div>
  144. <div>已产量:<el-tooltip class="item" effect="dark" :content="item.produced_qty" placement="top">
  145. <span style="font-size: 11px">{{ item.produced_qty }}</span>
  146. </el-tooltip>件</div>
  147. <div>发货量:<el-tooltip class="item" effect="dark" :content="item.shipped_qty" placement="top">
  148. <span style="font-size: 11px">{{ item.shipped_qty }}</span>
  149. </el-tooltip>件</div>
  150. <div>备注:<el-tooltip class="item" effect="dark" :content="item.produced_remark" placement="top">
  151. <span style="font-size: 11px">{{ item.produced_remark }}</span>
  152. </el-tooltip></div>
  153. <div>生产状态:<span style="font-size: 11px">{{ item.produce_status }}</span></div>
  154. <div v-if="item.produce_img">
  155. <el-upload :action="`${MixinUploadApi}?scene=pjorders`" :file-list="getImg(item.name, item.produce_img)" :on-preview="handlePictureCardPreview" :before-upload="beforeAvatarUpload"
  156. :on-success="handleImageSuccess" :on-remove="handleRemove" :on-exceed="handleExceed" disabled :limit="1">
  157. </el-upload>
  158. </div>
  159. </div>
  160. </template>
  161. </el-col>
  162. </el-row>
  163. </div>
  164. </el-card>
  165. </el-col>
  166. </el-row>
  167. <el-divider>其它选配</el-divider>
  168. <el-row :gutter="24" type="flex" style="flex-wrap: wrap; flex-direction: row">
  169. <el-col :span="12" v-for="item in addonDevice" :key="item.id">
  170. <el-card shadow="always">
  171. <div slot="header" class="clearfix">
  172. <el-link @click="() => { $router.push({ path: `/pj/pj-goods-detail/${item.good_id}` }) }">{{ item.name }}</el-link>
  173. <el-button v-if="boolFounder" size="mini" @click="changeEdit(item)">修改</el-button>
  174. </div>
  175. <div>
  176. <div class="param-item">
  177. <div class="image">
  178. <el-link @click="() => { $router.push({ path: `/pj/pj-goods-detail/${item.good_id}` }) }">
  179. <img :src="item.image">
  180. </el-link>
  181. </div>
  182. <div class="info">
  183. <div>生产型号:{{ item.code }}</div>
  184. <div>产品编码:{{ item.no }}</div>
  185. <div>产品类型:{{ item.good_type }}</div>
  186. <div>生产周期:{{ item.produce_day }}天</div>
  187. <div>数量:{{item.qty}}</div>
  188. <div>价格:{{item.price}}</div>
  189. </div>
  190. </div>
  191. <el-tooltip class="item" effect="dark" :content="item.sales_remark" placement="top">
  192. <div class="myFont"><span style="font-size: 11px">{{ item.sales_remark }}</span></div>
  193. </el-tooltip>
  194. <el-row>
  195. <el-col :span="12">
  196. <template v-if="boolFounder || permissions.filter(p => p === 'pjTech' || p === 'pjOrderItemsList').length > 0">
  197. <el-divider>技术:
  198. <el-button type="text" icon="el-icon-edit-outline" @click="handleTechSave(item)">保存</el-button>
  199. </el-divider>
  200. <div class="tech_panel">
  201. <div class="myFont">填写人:
  202. <el-tooltip class="item" effect="dark" :content="item.tech_name" placement="top">
  203. <span style="font-size: 11px">{{item.tech_name}}</span>
  204. </el-tooltip>
  205. </div>
  206. <div class="myFont">填写时间:
  207. <el-tooltip class="item" effect="dark" :content="item.tech_time" placement="top">
  208. <span style="font-size: 11px">{{ item.tech_time }}</span>
  209. </el-tooltip>
  210. </div>
  211. <div>硬件版本:<el-input v-model="item.hard_ver" size="small"></el-input></div>
  212. <div>软件版本:<el-input v-model="item.soft_ver" size="small"></el-input></div>
  213. <div>备注:<el-input type="textarea" rows="3" placeholder="备注,最大150字" maxlength="150" show-word-limit v-model="item.tech_remark"></el-input></div>
  214. <div @click="clickImg(index, 1)">
  215. <el-upload :action="`${MixinUploadApi}?scene=pjorders`" :file-list="getImg(item.name, item.tech_img)" :on-preview="handlePictureCardPreview" :before-upload="beforeAvatarUpload"
  216. :on-success="handleImageSuccess" :on-remove="handleRemove" :on-exceed="handleExceed" :limit="1">
  217. <el-button v-if="!item.tech_img" size="small" type="primary">点击上传</el-button>
  218. </el-upload>
  219. </div>
  220. </div>
  221. </template>
  222. <template v-else>
  223. <el-divider>技术:</el-divider>
  224. <div class="tech_panel myFont">
  225. <div class="">填写人:
  226. <el-tooltip class="item" effect="dark" :content="item.tech_name" placement="top">
  227. <span style="font-size: 11px">{{item.tech_name}}</span>
  228. </el-tooltip>
  229. </div>
  230. <div>填写时间:
  231. <el-tooltip class="item" effect="dark" :content="item.tech_time" placement="top">
  232. <span style="font-size: 11px">{{ item.tech_time }}</span>
  233. </el-tooltip>
  234. </div>
  235. <div>硬件版本:<el-tooltip class="item" effect="dark" :content="item.hard_ver" placement="top">
  236. <span style="font-size: 11px">{{item.hard_ver}}</span>
  237. </el-tooltip>
  238. </div>
  239. <div>软件版本:<el-tooltip class="item" effect="dark" :content="item.soft_ver" placement="top">
  240. <span style="font-size: 11px">{{item.soft_ver}}</span>
  241. </el-tooltip></div>
  242. <div>备注:<el-tooltip class="item" effect="dark" :content="item.tech_remark" placement="top">
  243. <span style="font-size: 11px">{{item.tech_remark}}</span>
  244. </el-tooltip></div>
  245. <div v-if="item.tech_img">
  246. <el-upload :action="`${MixinUploadApi}?scene=pjorders`" :file-list="getImg(item.name, item.tech_img)" :on-preview="handlePictureCardPreview" :before-upload="beforeAvatarUpload"
  247. :on-success="handleImageSuccess" :on-remove="handleRemove" :on-exceed="handleExceed" disabled:limit="1">
  248. </el-upload>
  249. </div>
  250. </div>
  251. </template>
  252. </el-col>
  253. <el-col :span="12">
  254. <template v-if="boolFounder || permissions.filter(p => p === 'pjOrderItemsList').length > 0">
  255. <el-divider>生产:
  256. <el-button type="text" icon="el-icon-edit-outline" @click="handleProduceSave(item)">保存</el-button>
  257. </el-divider>
  258. <div class="tech_panel">
  259. <div class="myFont">填写人:
  260. <el-tooltip class="item" effect="dark" :content="item.produce_name" placement="top">
  261. <span style="font-size: 11px">{{item.produce_name}}</span>
  262. </el-tooltip>
  263. </div>
  264. <div class="myFont">填写时间:
  265. <el-tooltip class="item" effect="dark" :content="item.produce_time" placement="top">
  266. <span style="font-size: 11px">{{ item.produce_time }}</span>
  267. </el-tooltip>
  268. </div>
  269. <div>已产量:<el-input v-model="item.produced_qty"><template slot="append">共{{item.qty}}</template></el-input></div>
  270. <div>发货量:<el-input v-model="item.shipped_qty" /></div>
  271. <div>备注:
  272. <el-input type="textarea" rows="3" placeholder="备注,最大150字" maxlength="150" show-word-limit v-model="item.produced_remark"></el-input>
  273. </div>
  274. <div>生产状态:
  275. <el-select placeholder="请选择" slot="prepend" v-model="item.produce_status">
  276. <el-option value="采购原料中"></el-option>
  277. <el-option value="生产中"></el-option>
  278. <el-option value="完成"></el-option>
  279. </el-select>
  280. </div>
  281. <div @click="clickImg(index, 2)">
  282. <el-upload :action="`${MixinUploadApi}?scene=pjorders`" :file-list="getImg(item.name, item.produce_img)" :on-preview="handlePictureCardPreview" :before-upload="beforeAvatarUpload"
  283. :on-success="handleImageSuccess" :on-remove="handleRemove" :on-exceed="handleExceed" :limit="1">
  284. <el-button v-if="!item.produce_img" size="small" type="primary">点击上传</el-button>
  285. </el-upload>
  286. </div>
  287. </div>
  288. </template>
  289. <template v-else>
  290. <el-divider>生产情况</el-divider>
  291. <div class="tech_panel myFont">
  292. <div>填写人:
  293. <el-tooltip class="item" effect="dark" :content="item.produce_name" placement="top">
  294. <span style="font-size: 11px">{{item.produce_name}}</span>
  295. </el-tooltip>
  296. </div>
  297. <div>填写时间:
  298. <el-tooltip class="item" effect="dark" :content="item.produce_time" placement="top">
  299. <span style="font-size: 11px">{{ item.produce_time }}</span>
  300. </el-tooltip>
  301. </div>
  302. <div>已产量:<el-tooltip class="item" effect="dark" :content="item.produced_qty" placement="top">
  303. <span style="font-size: 11px">{{ item.produced_qty }}</span>
  304. </el-tooltip>件</div>
  305. <div>发货量:<el-tooltip class="item" effect="dark" :content="item.shipped_qty" placement="top">
  306. <span style="font-size: 11px">{{ item.shipped_qty }}</span>
  307. </el-tooltip>件</div>
  308. <div>备注:<el-tooltip class="item" effect="dark" :content="item.produced_remark" placement="top">
  309. <span style="font-size: 11px">{{ item.produced_remark }}</span>
  310. </el-tooltip></div>
  311. <div>生产状态:<span style="font-size: 11px">{{ item.produce_status }}</span></div>
  312. <div v-if="item.produce_img">
  313. <el-upload :action="`${MixinUploadApi}?scene=pjorders`" :file-list="getImg(item.name, item.produce_img)" :on-preview="handlePictureCardPreview" :before-upload="beforeAvatarUpload"
  314. :on-success="handleImageSuccess" :on-remove="handleRemove" :on-exceed="handleExceed" disabled :limit="1">
  315. </el-upload>
  316. </div>
  317. </div>
  318. </template>
  319. </el-col>
  320. </el-row>
  321. </div>
  322. </el-card>
  323. </el-col>
  324. </el-row>
  325. </el-tab-pane>
  326. <el-tab-pane label="表格">
  327. <el-table :data="listData" stripe style="width: 100%;">
  328. <el-table-column prop="name" show-overflow-tooltip label="名称" min-width="140"></el-table-column>
  329. <el-table-column label="基础件?">
  330. <template slot-scope="scope">
  331. <el-tag type="success" v-if="scope.row.type_base">标准件</el-tag>
  332. <el-tag type="info" v-else>配件</el-tag>
  333. </template>
  334. </el-table-column>
  335. <el-table-column prop="code" show-overflow-tooltip label="生产型号"></el-table-column>
  336. <el-table-column prop="no" show-overflow-tooltip label="生产编码"></el-table-column>
  337. <el-table-column prop="hard_ver" show-overflow-tooltip label="硬件版本"></el-table-column>
  338. <el-table-column prop="soft_ver" show-overflow-tooltip label="软件版本"></el-table-column>
  339. <el-table-column prop="good_type" label="类型" width="100"></el-table-column>
  340. <el-table-column prop="qty" label="数量" width="100"></el-table-column>
  341. <el-table-column prop="produced_qty" label="已产数量" width="100"></el-table-column>
  342. <el-table-column prop="produced_qty" label="需产数量" width="100">
  343. <template slot-scope="scope">
  344. <span>{{ scope.row.qty - scope.row.produced_qty}}</span>
  345. </template>
  346. </el-table-column>
  347. <el-table-column prop="shipped_qty" label="已发数量" width="100"></el-table-column>
  348. <el-table-column v-if="boolFounder || permissions.filter(p => p === 'draftEdit' || p === 'pjReceipt').length > 0" prop="price" label="价格" width="100"></el-table-column>
  349. <el-table-column prop="sales_remark" show-overflow-tooltip label="销售备注"></el-table-column>
  350. <el-table-column prop="produced_remark" show-overflow-tooltip label="生产备注"></el-table-column>
  351. </el-table>
  352. <div style="margin-top: 20px">
  353. <el-button type="primary" @click="outExcel">导出Excel</el-button>
  354. </div>
  355. </el-tab-pane>
  356. </el-tabs>
  357. <el-dialog :visible.sync="dialogImage">
  358. <img width="100%" :src="dialogImageUrl" alt="">
  359. </el-dialog>
  360. <el-drawer
  361. title="设备"
  362. :visible.sync="goodsSelectVisible"
  363. :append-to-body="true"
  364. size="80%"
  365. >
  366. <goods-select :type="type" :type_base="type_base" @selected="goodsSelect"></goods-select>
  367. </el-drawer>
  368. </div>
  369. </template>
  370. <script>
  371. import * as API_orderItems from '@/api/pjOrderItems.js'
  372. import { Foundation } from '~/ui-utils'
  373. import Storage from '../../utils/storage'
  374. import goodsSelect from '../goods/goodsSelect.vue'
  375. import { editModel } from '../../api/pjOrderItems'
  376. export default {
  377. name: 'pjOrderItems',
  378. components: { goodsSelect },
  379. props: {
  380. orderNo: {
  381. type: String,
  382. value: ''
  383. },
  384. type: {
  385. type: String,
  386. value: '服务器版'
  387. }
  388. },
  389. data() {
  390. return {
  391. boolFounder: JSON.parse(Storage.getItem('admin_user')).founder === 1,
  392. permissions: [],
  393. keyId: '',
  394. params: {
  395. page_no: 1,
  396. page_size: 1000,
  397. sort: 'type_base',
  398. dir: 'desc'
  399. },
  400. listData: [],
  401. baseDevice: [],
  402. addonDevice: [],
  403. dialogImage: false,
  404. dialogImageUrl: '',
  405. changeId: null,
  406. index: 0,
  407. imgType: 1,
  408. goodsSelectVisible: false,
  409. type_base: true
  410. }
  411. },
  412. mounted() {
  413. if (!this.boolFounder) {
  414. this.permissions = JSON.parse(Storage.getItem('permissions'))
  415. }
  416. },
  417. activated() {
  418. },
  419. watch: {
  420. orderNo(val) {
  421. if (val) {
  422. this.getData()
  423. }
  424. }
  425. },
  426. methods: {
  427. getData() {
  428. this.params.fixedCondition = 'order_no=' + this.orderNo
  429. API_orderItems.getList(this.params).then(res => {
  430. this.listData = res.data
  431. this.baseDevice = this.listData.filter(p => p.type_base)
  432. this.addonDevice = this.listData.filter(p => !p.type_base)
  433. })
  434. },
  435. handleSave(item) {
  436. if (!this.boolFounder) {
  437. this.$message.error('您没有权限!')
  438. return
  439. }
  440. API_orderItems.editModel(item).then(res => {
  441. this.$message.success('保存成功!')
  442. })
  443. },
  444. handleTechSave(item) {
  445. const adminUser = JSON.parse(Storage.getItem('admin_user'))
  446. item.tech_user = adminUser.uid
  447. if (item.tech_name) {
  448. item.tech_name = item.tech_name + ',' + adminUser.realname
  449. } else {
  450. item.tech_name = adminUser.realname
  451. }
  452. if (item.tech_time) {
  453. item.tech_time = item.tech_time + ',' + Foundation.unixToDate(Math.round(new Date() / 1000))
  454. } else {
  455. item.tech_time = Foundation.unixToDate(Math.round(new Date() / 1000))
  456. }
  457. API_orderItems.editModelAndStatus(item, 1).then(res => {
  458. this.$message.success('保存成功!')
  459. })
  460. },
  461. handleProduceSave(item) {
  462. if (item.produced_qty) {
  463. if (item.produced_qty < 0) {
  464. this.$message.error('数量不能小于0!')
  465. return
  466. }
  467. }
  468. const adminUser = JSON.parse(Storage.getItem('admin_user'))
  469. item.produce_user = adminUser.uid
  470. if (item.produce_name) {
  471. item.produce_name = item.produce_name + ',' + adminUser.realname
  472. } else {
  473. item.produce_name = adminUser.realname
  474. }
  475. if (item.produce_time) {
  476. item.produce_time = item.produce_time + ',' + Foundation.unixToDate(Math.round(new Date() / 1000))
  477. } else {
  478. item.produce_time = Foundation.unixToDate(Math.round(new Date() / 1000))
  479. }
  480. API_orderItems.editModelAndStatus(item, 2).then(res => {
  481. this.$message.success('保存成功!')
  482. })
  483. },
  484. outExcel() {
  485. const json = {
  486. sheet_name: '产品列表',
  487. sheet_values: this.listData.map(item => ({
  488. '产品名称': item.name,
  489. '生产型号': item.code,
  490. '生产编码': item.no,
  491. '硬件版本': item.hard_ver,
  492. '软件编码': item.soft_ver,
  493. '产品类型': item.good_type,
  494. '数量': item.qty,
  495. '已产数量': item.produced_qty,
  496. '需产数量': item.qty - item.produced_qty,
  497. '已发数量': item.shipped_qty,
  498. '销售备注': item.sales_remark,
  499. '生产备注': item.produced_remark
  500. }))
  501. }
  502. this.MixinExportJosnToExcel(json, '产品列表')
  503. },
  504. handlePictureCardPreview(file) {
  505. this.dialogImageUrl = file.url
  506. this.dialogImage = true
  507. },
  508. /** 图片上传之前的校验 */
  509. beforeAvatarUpload(file) {
  510. const isType = file.type === 'image/jpeg' || file.type === 'image/jpg' || file.type === 'image/png'
  511. const isLt1M = file.size / 1024 / 1024 < 3
  512. if (!isType) {
  513. this.$message.error('上传图片只能是 JPG/JPEG/PNG 格式!')
  514. }
  515. if (!isLt1M) {
  516. this.$message.error('上传图片大小不能超过 3MB!')
  517. }
  518. return isType && isLt1M
  519. },
  520. /** 文件列表上传成功时的钩子 上传成功校验 */
  521. async handleImageSuccess(response, file) {
  522. if (file.status === 'success') {
  523. if (this.imgType === 1) {
  524. this.$set(this.baseDevice[this.index], 'tech_img', response.url)
  525. } else {
  526. this.$set(this.baseDevice[this.index], 'produce_img', response.url)
  527. }
  528. }
  529. },
  530. handleRemove(e) {
  531. setTimeout(() => {
  532. if (this.imgType === 1) {
  533. this.$set(this.baseDevice[this.index], 'tech_img', null)
  534. } else {
  535. this.$set(this.baseDevice[this.index], 'produce_img', null)
  536. }
  537. }, 400)
  538. },
  539. handleExceed(e) {
  540. this.$message.error('最多只能上传一个文件!')
  541. },
  542. clickImg(index, type) {
  543. this.index = index
  544. this.imgType = type
  545. },
  546. changeEdit(item) {
  547. this.changeId = item.id
  548. this.type_base = item.type_base
  549. this.goodsSelectVisible = true
  550. },
  551. goodsSelect(list) {
  552. if (list.length > 1) {
  553. this.$message.error('只能选择一个产品!')
  554. return
  555. }
  556. if (this.listData.findIndex(p => p.good_id === list[0].id) > -1) {
  557. this.$message.error('产品已存在!')
  558. return
  559. }
  560. const data = {
  561. good_id: list[0].id,
  562. name: list[0].name,
  563. code: list[0].code,
  564. no: list[0].no,
  565. image: list[0].image,
  566. id: this.changeId
  567. }
  568. API_orderItems.editModel(data).then(res => {
  569. this.$message.success('保存成功!')
  570. this.getData()
  571. })
  572. this.goodsSelectVisible = false
  573. },
  574. getImg(name, img) {
  575. if (img) {
  576. return [{ name: name + '备注图', url: img }]
  577. } else {
  578. return []
  579. }
  580. },
  581. formartLen(str) {
  582. console.log('str===', str)
  583. if (!str) {
  584. return ''
  585. } else {
  586. return str.length > 20 ? str.substr(0, 20) + '...' : str
  587. }
  588. }
  589. }
  590. }
  591. </script>
  592. <style type="text/scss" lang="scss" scoped>
  593. .param-item {
  594. display: flex;
  595. align-items: center;
  596. //justify-content: space-between;
  597. padding: 3px;
  598. font-size: 14px;
  599. .image {
  600. width: 38%;
  601. }
  602. .image img {
  603. width: 100px;
  604. height: 100px;
  605. }
  606. .info div {
  607. margin-bottom: 5px;
  608. }
  609. &.empty {
  610. background-color: #fff
  611. }
  612. }
  613. .tech_panel div{
  614. margin: 8px 5px 3px 3px;
  615. }
  616. .avatar {
  617. width: 100px;
  618. height: 100px;
  619. display: block;
  620. }
  621. .myFont {
  622. overflow: hidden;
  623. text-overflow: ellipsis; //超出部分以省略号显示
  624. white-space: nowrap;
  625. width: 16em; //用px单位亦可行
  626. }
  627. </style>