detail.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. <template>
  2. <div class="goodsCostDetail">
  3. <div class="goodsCostDetail-main" v-if="powers.some((i) => i == '007')">
  4. <el-tabs v-model="activeTabs">
  5. <el-tab-pane label="新建商品成本" name="0" v-if="queryType === 'add'">
  6. <base-form
  7. v-if="newTime !== ''"
  8. :type="queryType"
  9. :id="queryId"
  10. :newTime="newTime"
  11. :sitem="sitem"
  12. @refresh="refresh"
  13. />
  14. </el-tab-pane>
  15. <el-tab-pane label="商品成本详情" name="1" v-if="queryType !== 'add'">
  16. <el-collapse v-model="activeNames" style="margin: -18px 0 0 0">
  17. <tempalte v-if="queryType === 'editCoin' || queryType === 'editBase' || queryType === 'edit'">
  18. <el-collapse-item title="商品成本详情" name="0">
  19. <base-form
  20. v-if="newTime !== ''"
  21. :type="queryType"
  22. :id="queryId"
  23. :newTime="newTime"
  24. :sitem="sitem"
  25. @refresh="refresh"
  26. />
  27. </el-collapse-item>
  28. </tempalte>
  29. <template v-else>
  30. <el-collapse-item title="基础信息" name="1">
  31. <show-data-table :columns="basicColumns" :sitem="sitem">
  32. <template slot="noble">
  33. <span
  34. v-if="sitem.noble_metal"
  35. >{{ sitem.noble_weight ? sitem.noble_weight : "0" }}g-{{
  36. sitem.noble_name
  37. }}-{{ sitem.gold_price ? sitem.gold_price : "0" }}元/g-{{
  38. sitem.is_gold_price + '' === "0" ? "不" : ""
  39. }}启用实时金价-{{ sitem.is_diff + '' === "1" ? "有" : "无" }}工差-{{
  40. sitem.config
  41. }}-{{ sitem.other_config }}</span>
  42. </template>
  43. <template slot="cat_info">
  44. {{sitem.cat_info ? sitem.cat_info.map(({name}) => name).join('_') : '--' }}
  45. </template>
  46. <template slot="weight">
  47. {{sitem.weight}}g
  48. </template>
  49. <template slot="tax">
  50. {{sitem.tax}}%
  51. </template>
  52. <template slot="is_stock">
  53. {{String(sitem.is_stock) === '0' ? '非库存品' : '库存品'}}
  54. </template>
  55. <template slot="is_exclusive">
  56. {{String(sitem.is_exclusive) === '0' ? '非泰康' : '泰康'}}
  57. </template>
  58. <template slot="good_img">
  59. <template v-if="sitem.good_img">
  60. <el-image style="height: 20px;width: 20px;margin-right: 10px" v-for="(img,index) in sitem.good_img.split(',')" :src="img" :preview-src-list="sitem.good_img.split(',')" :key="index" />
  61. </template>
  62. </template>
  63. <template slot="good_info_img">
  64. <el-image style="height: 20px;width: 20px" :src="sitem.good_info_img" :preview-src-list="[sitem.good_info_img]" />
  65. </template>
  66. <template slot="good_name">
  67. <img
  68. v-if="sitem.good_thumb_img"
  69. v-viewer
  70. style="width: 23px; height: 23px; margin: 0 5px 0 0"
  71. class="fl"
  72. :src="sitem.good_thumb_img"
  73. alt=""
  74. >
  75. <span>{{ sitem.good_name }}</span>
  76. <span v-for="(si, i) in sitem.speclist" :key="si.spec_id + i">
  77. <span v-if="i !== 0">-</span>
  78. <span v-else>_</span>
  79. <span>{{ si.spec_name }}[{{ si.spec_value }}]</span>
  80. </span>
  81. <el-popover placement="top" width="300" trigger="hover">
  82. <ul>
  83. <li
  84. v-if=" newTime !== '' && isDisplayPrivateField('1')"
  85. >
  86. <span>商品成本编号:</span><span>{{ sitem.spuCode }}</span>
  87. </li>
  88. </ul>
  89. <i slot="reference" class="el-icon-warning-outline fr" />
  90. </el-popover>
  91. </template>
  92. <template slot="noble_weight">{{sitem.noble_weight}}g</template>
  93. <template slot="is_gold_price">{{String(sitem.is_gold_price) === '1' ? '是' : '否'}}</template>
  94. <template slot="is_diff">{{String(sitem.is_diff) === '1' ? '有公差' : '无工差'}}</template>
  95. <template slot="delivery_day">{{sitem.delivery_day}}天</template>
  96. <template slot="lead_time">{{sitem.lead_time}}天</template>
  97. <template slot="sample_day">{{sitem.sample_day}}天</template>
  98. <template slot="delivery_place">{{delivery_place}}</template>
  99. <template slot="origin_place">{{origin_place}}</template>
  100. <template slot="packing_weight">
  101. {{sitem.packing_weight}}g
  102. </template>
  103. </show-data-table>
  104. </el-collapse-item>
  105. <!-- <el-collapse-item title="规格信息" name="2">
  106. <el-table :data="sitem.speclist" :size="'mini'" border style="width: 100%">
  107. <el-table-column prop="spec_name" label="规格类型" />
  108. <el-table-column prop="spec_value" label="规格值" />
  109. </el-table>
  110. </el-collapse-item> -->
  111. <!-- <el-collapse-item title="包装信息" name="3">
  112. <show-data-table :columns="packingColumns" :sitem="sitem">
  113. <template slot="packing_weight">
  114. {{sitem.packing_weight}}g
  115. </template>
  116. </show-data-table>
  117. </el-collapse-item>
  118. <el-collapse-item title="发货信息" name="4">
  119. <show-data-table :columns="sendColumns" :sitem="sitem">
  120. <template slot="delivery_day">{{sitem.delivery_day}}天</template>
  121. <template slot="lead_time">{{sitem.lead_time}}天</template>
  122. <template slot="sample_day">{{sitem.sample_day}}天</template>
  123. <template slot="delivery_place">{{delivery_place}}</template>
  124. <template slot="origin_place">{{origin_place}}</template>
  125. </show-data-table>
  126. </el-collapse-item> -->
  127. <!-- <el-collapse-item title="图片信息" name="5">
  128. <show-data-table :columns="imageColumns" :sitem="sitem">
  129. <template slot="good_thumb_img">
  130. <el-image style="height: 40px;width: 40px" :src="sitem.good_thumb_img" :preview-src-list="[sitem.good_thumb_img]" />
  131. </template>
  132. <template slot="good_img">
  133. <template v-if="sitem.good_img">
  134. <el-image style="height: 40px;width: 40px;margin-right: 10px" v-for="(img,index) in sitem.good_img.split(',')" :src="img" :preview-src-list="sitem.good_img.split(',')" :key="index" />
  135. </template>
  136. </template>
  137. <template slot="good_info_img">
  138. <el-image style="height: 40px;width: 40px" :src="sitem.good_info_img" :preview-src-list="[sitem.good_info_img]" />
  139. </template>
  140. </show-data-table>
  141. </el-collapse-item> -->
  142. <el-collapse-item title="固定与阶梯成本" name="6" v-if="displayCostField">
  143. <show-data-table :columns="ladderColumns" :sitem="sitem">
  144. <template slot="demo_fee">{{sitem.demo_fee}}元</template>
  145. <template slot="open_fee">{{sitem.open_fee}}元</template>
  146. <template slot="sample_fee">{{sitem.sample_fee}}元</template>
  147. <template slot="market_price">{{sitem.market_price}}元</template>
  148. <template slot="data_table">
  149. <el-table size="mini" :data="sitem.nakelist">
  150. <el-table-column prop="min_num" label="起订量(>=)" />
  151. <el-table-column prop="nake_fee" label="成本单价" />
  152. <el-table-column prop="cost_fee" label="工艺费" />
  153. <el-table-column prop="delivery_fee" label="物流费" />
  154. <el-table-column prop="cert_fee" label="证书费" />
  155. <el-table-column prop="mark_fee" label="加标费" />
  156. <el-table-column prop="package_fee" label="包装费" />
  157. <el-table-column prop="other_fee" label="其他费用" />
  158. <el-table-column prop="nake_total" label="成本合计" />
  159. </el-table>
  160. </template>
  161. </show-data-table>
  162. </el-collapse-item>
  163. <el-collapse-item
  164. title="采购部门审批"
  165. v-if="
  166. ((status + '' === '0' && ppowers.some((i) => i == '0')) ||
  167. (status + '' === '2' && ppowers.some((i) => i == '2')) ||
  168. (status + '' === '3' && ppowers.some((i) => i == '3'))) &&
  169. queryType === 'view'
  170. "
  171. >
  172. <exam-form
  173. :statusList="statusList"
  174. :newTime="newTime"
  175. :disabled="false"
  176. :isMust="false"
  177. @searchChange="examForm"
  178. />
  179. </el-collapse-item>
  180. </template>
  181. </el-collapse>
  182. </el-tab-pane>
  183. <el-tab-pane label="审批记录" name="2" v-if="queryType !== 'add'">
  184. <process-time-line
  185. v-if="newTime !== ''"
  186. :newTime="newTime"
  187. :type="'SPCB'"
  188. :orderCode="queryId"
  189. />
  190. </el-tab-pane>
  191. <el-tab-pane label="流程图" name="3" v-if="queryType !== 'add'">
  192. <flow-chart process_id="15" type="SPCB" :orderCode="queryId" />
  193. </el-tab-pane>
  194. </el-tabs>
  195. </div>
  196. <div v-else>
  197. <no-auth></no-auth>
  198. </div>
  199. </div>
  200. </template>
  201. <script>
  202. import asyncRequest from "@/apis/service/goodStore/goodsCost";
  203. import resToken from "@/mixins/resToken";
  204. import { mapGetters } from "vuex";
  205. import baseForm from "./components/baseForm";
  206. import costForm from './components/costDetail'
  207. import ShowDataTable from '@/views/standingBook/components/detail-data-table.vue'
  208. import { basicColumns, packingColumns, sendColumns, imageColumns, ladderColumns } from './columns'
  209. import privateField from "@/mixins/privateField";
  210. export default {
  211. name: "supplierGoodsCostDetail",
  212. mixins: [resToken, privateField],
  213. components: {
  214. ShowDataTable,
  215. baseForm,
  216. costForm
  217. },
  218. computed: {
  219. ...mapGetters(["tablebtnSize", "searchSize", "size", "private_field", "originLevel"]),
  220. displayCostField(){
  221. return (["1", '3']).includes(this.originLevel) || this.private_field.includes('1')
  222. },
  223. powers() {
  224. const { btnList } = this.$store.getters
  225. const tran = btnList.find((item) => item.menu_route == "supplierGoodsCostDetail") || {};
  226. const { action } = tran ?? {};
  227. return action ?? [];
  228. },
  229. ppowers() {
  230. const tran =
  231. this.$store.getters.roleProcess.find((i) => i.process_type === "SPCB") || {};
  232. const { action } = tran ?? {};
  233. return action ?? [];
  234. },
  235. },
  236. data() {
  237. return {
  238. statusList: [],
  239. basicColumns,
  240. packingColumns,
  241. sendColumns,
  242. imageColumns,
  243. ladderColumns,
  244. size: "small",
  245. activeTabs: "1",
  246. activeNames: ["0", "1", "2", "3", "4", "5", "6"],
  247. newTime: "",
  248. loading: false,
  249. queryType: "",
  250. queryId: "",
  251. status: "",
  252. sitem: null,
  253. delivery_place: '',
  254. origin_place: ''
  255. };
  256. },
  257. mounted() {
  258. this.initForm();
  259. },
  260. methods: {
  261. async initForm() {
  262. const { id, type } = this.$route.query;
  263. this.queryId = id;
  264. this.queryType = type;
  265. this.activeTabs = type === "add" ? "0" : "1";
  266. this.loading = true;
  267. if (this.queryType === "add") {
  268. this.sitem = {};
  269. this.getNewTime();
  270. } else {
  271. await this.initData();
  272. await this.getArea('delivery_place');
  273. await this.getArea('origin_place');
  274. }
  275. this.loading = false;
  276. },
  277. // 点击业务审核的保存按钮
  278. async examForm(e) {
  279. console.log(e);
  280. if (!this.loading) {
  281. let type = "";
  282. if (e.state + '' === "1") {
  283. type = "1";
  284. } else {
  285. type =
  286. this.status + '' === "0"
  287. ? "6"
  288. : this.status + '' === "2"
  289. ? "4"
  290. : this.status + '' === "3"
  291. ? "5"
  292. : "";
  293. }
  294. await this.setstatus(type, "提交采购部门审核", e.remark);
  295. }
  296. },
  297. async getArea(prop = 'delivery_place'){
  298. const chunks = this.sitem[prop].split(',');
  299. let { data: province } = await asyncRequest.province();
  300. province = province.find(({province_code}) => province_code === chunks[0])
  301. let { data: city } = await asyncRequest.city({code: chunks[0]})
  302. city = city.find(({city_code}) => city_code === chunks[1])
  303. let { data: area } = await asyncRequest.area({code: chunks[1]})
  304. area = area.find(({area_code}) => area_code === chunks[2])
  305. this[prop] = [province,city,area].map(({name}) => name).join("_")
  306. },
  307. async setstatus(type, detail, remark) {
  308. await this.$confirm(`确定要${detail}?`, {
  309. confirmButtonText: "确定",
  310. cancelButtonText: "取消",
  311. type: "warning",
  312. })
  313. .then(async () => {
  314. let _model = {
  315. spuCode: this.queryId,
  316. status: type,
  317. remark: remark,
  318. };
  319. let res = await asyncRequest.status(_model);
  320. if (res && res.code === 0) {
  321. this.$notify.success({
  322. title: "提交成功!",
  323. message: "",
  324. });
  325. await this.initForm();
  326. } else if (res && res.code >= 100 && res.code <= 104) {
  327. await this.logout();
  328. } else {
  329. this.$message.warning(res.message);
  330. }
  331. })
  332. .catch(() => {
  333. console.log("取消");
  334. });
  335. },
  336. handleClick(row) {
  337. console.log(row);
  338. },
  339. async refresh(e) {
  340. await this.routeReGoto("goodsCost", {});
  341. },
  342. async initData() {
  343. this.loading = true;
  344. const { code, message, data } = await asyncRequest.detail({
  345. spuCode: this.queryId,
  346. });
  347. this.loading = false;
  348. if (code === 0) {
  349. this.sitem = JSON.parse(JSON.stringify(data));
  350. const { status } = this.sitem;
  351. this.status = status;
  352. this.getNewTime();
  353. } else if (code >= 100 && code <= 104) {
  354. await this.logout();
  355. } else {
  356. this.$message.warning(message);
  357. }
  358. },
  359. getNewTime() {
  360. this.newTime = new Date().valueOf();
  361. },
  362. },
  363. };
  364. </script>
  365. <style lang="scss" scoped>
  366. .goodsCostDetail {
  367. width: 100%;
  368. box-sizing: border-box;
  369. .goodsCostDetail-main {
  370. box-sizing: border-box;
  371. padding: 10px;
  372. height: 100%;
  373. width: 100%;
  374. }
  375. .goodsCostDetail-title {
  376. border-top: 1px solid #ebeef5;
  377. span {
  378. height: 50px;
  379. line-height: 50px;
  380. font-family: "微软雅黑", sans-serif;
  381. font-weight: 400;
  382. font-style: normal;
  383. font-size: 16fpx;
  384. text-align: left;
  385. }
  386. }
  387. /deep/ .ddiv {
  388. border-top: 1px solid #dcdfe6;
  389. }
  390. /deep/ .dtitle {
  391. width: 40px;
  392. text-align: center;
  393. height: 100%;
  394. min-height: 100%;
  395. ul {
  396. padding: 12px 0 0 0;
  397. }
  398. }
  399. /deep/ .dmain {
  400. padding: 20px 0 0 0;
  401. width: calc(100% - 40px);
  402. border-left: 1px solid #dcdfe6;
  403. }
  404. }
  405. </style>