group-com-goods.php 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. ComponentHelper::loadComponentView('goods/com-attr', __DIR__);
  4. ComponentHelper::loadComponentView('com-attr-select');
  5. ComponentHelper::loadComponentView('com-select-goods');
  6. ComponentHelper::loadComponentView('com-rich-text');
  7. ?>
  8. <style>
  9. .type_text {
  10. font-size: 16px;
  11. font-weight: 600;
  12. color: #333;
  13. margin-right: 20px;
  14. }
  15. .detail_top {
  16. flex-wrap: wrap;
  17. }
  18. .detail_box {
  19. margin-top: 10px;
  20. }
  21. .coupon_box {
  22. width: 600px;
  23. margin-right: 50px;
  24. }
  25. .detail_top .coupon_box:last-child {
  26. margin-right: 0px;
  27. }
  28. .coupon_list_box {
  29. padding: 20px 20px 0 0;
  30. flex-wrap: wrap;
  31. box-sizing: border-box;
  32. overflow: hidden;
  33. height: 125px;
  34. }
  35. .coupon_list_box_active {
  36. height: auto;
  37. }
  38. .coupon_list_item {
  39. background: #F4F4F4;
  40. width: 275px;
  41. border-radius: 5px;
  42. position: relative;
  43. margin-bottom: 15px;
  44. padding: 10px;
  45. }
  46. .add_coupon .el-button {
  47. padding: 6px 18px;
  48. margin: 20px 0;
  49. }
  50. .close_icon {
  51. font-size: 20px;
  52. font-weight: 700;
  53. position: absolute;
  54. right: 10px;
  55. top: 8px;
  56. cursor: pointer;
  57. }
  58. .coupon_list_title {
  59. font-size: 16px;
  60. margin-bottom: 5px;
  61. width: 180px;
  62. }
  63. .coupon_list_content {
  64. margin-bottom: 2px;
  65. font-size: 12px;
  66. }
  67. .more_btn {
  68. text-align: center;
  69. cursor: pointer;
  70. margin-top: 20px;
  71. }
  72. .more_icon {
  73. transform: rotate(0deg);
  74. transition: all 0.7s;
  75. }
  76. .show_more_icon {
  77. transform: rotate(180deg);
  78. }
  79. .show {
  80. height: auto;
  81. }
  82. .hide {
  83. height: 0;
  84. overflow: hidden;
  85. }
  86. .transform-hide {
  87. opacity: 0;
  88. -webkit-transform: translateY(-50%);
  89. transform: translateY(-50%);
  90. -webkit-transition: .3s;
  91. transition: .3s;
  92. }
  93. .transform-show {
  94. opacity: 1 !important;
  95. -webkit-transform: translateY(0) !important;
  96. transform: translateY(0) !important;
  97. }
  98. .is_divider {
  99. display: block;
  100. }
  101. @media screen and (min-width: 1540px) {
  102. .is_divider {
  103. display: none;
  104. }
  105. }
  106. .red_envelope_box {
  107. width: 600px;
  108. margin-right: 50px;
  109. }
  110. .red_envelope_box:last-child {
  111. margin-right: 0px;
  112. }
  113. .red_envelope_box .el-input {
  114. width: 150px;
  115. }
  116. .red_envelope_box .el-textarea {
  117. width: 250px;
  118. }
  119. .el-input {
  120. flex: 1;
  121. }
  122. .el-textarea {
  123. flex: 1;
  124. }
  125. .types_box {
  126. padding: 20px 20px 30px;
  127. }
  128. .label_title {
  129. font-weight: 600;
  130. margin-bottom: 8px;
  131. font-size: 16px;
  132. }
  133. .checkt_select {
  134. width: 140px;
  135. }
  136. .check_input {
  137. width: 200px;
  138. margin-left: 10px;
  139. }
  140. .check_btn_list .el-button {
  141. padding: 6px 14px;
  142. margin-bottom: 20px;
  143. }
  144. .el-dialog__footer {
  145. text-align: center;
  146. }
  147. .check_pagination {
  148. justify-content: flex-end;
  149. margin-top: 20px;
  150. }
  151. /* 谷歌 */
  152. input::-webkit-outer-spin-button,
  153. input::-webkit-inner-spin-button {
  154. -webkit-appearance: none;
  155. appearance: none;
  156. margin: 0;
  157. }
  158. /* 火狐 */
  159. input {
  160. -moz-appearance: textfield;
  161. }
  162. /* 公共样式 */
  163. .flex {
  164. display: -webkit-box;
  165. display: -webkit-flex;
  166. /* #ifndef APP-NVUE */
  167. display: flex;
  168. /* #endif */
  169. }
  170. .flex-x-center {
  171. display: -webkit-box;
  172. display: -webkit-flex;
  173. /* #ifndef APP-NVUE */
  174. display: flex;
  175. /* #endif */
  176. -webkit-box-pack: center;
  177. -webkit-justify-content: center;
  178. -ms-flex-pack: center;
  179. justify-content: center;
  180. }
  181. .flex-x-between {
  182. display: -webkit-box;
  183. display: -webkit-flex;
  184. /* #ifndef APP-NVUE */
  185. display: flex;
  186. /* #endif */
  187. -webkit-box-pack: space-between;
  188. -webkit-justify-content: space-between;
  189. -ms-flex-pack: space-between;
  190. justify-content: space-between;
  191. }
  192. .flex-y-center {
  193. display: -webkit-box;
  194. display: -webkit-flex;
  195. /* #ifndef APP-NVUE */
  196. display: flex;
  197. /* #endif */
  198. -webkit-box-align: center;
  199. -webkit-align-items: center;
  200. -ms-flex-align: center;
  201. -ms-grid-row-align: center;
  202. align-items: center;
  203. }
  204. /* 溢出隐藏 */
  205. .over1 {
  206. text-overflow: -o-ellipsis-lastline;
  207. overflow: hidden;
  208. text-overflow: ellipsis;
  209. display: -webkit-box;
  210. -webkit-line-clamp: 1;
  211. -webkit-box-orient: vertical;
  212. }
  213. .over2 {
  214. text-overflow: -o-ellipsis-lastline;
  215. overflow: hidden;
  216. text-overflow: ellipsis;
  217. display: -webkit-box;
  218. -webkit-line-clamp: 2;
  219. -webkit-box-orient: vertical;
  220. }
  221. .huiyuanRadio {
  222. margin-bottom: 10px;
  223. }
  224. .header-require::after {
  225. content: '*';
  226. color: #F56C6C;
  227. margin-right: 2px;
  228. }
  229. </style>
  230. <template id="abc">
  231. <el-card shadow="never" style="border:0" body-style="background-color: #f3f3f3;padding: 10px 0 0;" class="com-goods" v-loading="cardLoading">
  232. <div>
  233. <el-form :model="cForm" :rules="cRule" ref="ruleForm" label-width="140px" size="small" class="demo-ruleForm">
  234. <el-tabs v-model="activeName">
  235. <el-tab-pane label="基础设置" name="first">
  236. <!-- 选择分类 -->
  237. <slot name="before_cats"></slot>
  238. <!-- 基本信息 -->
  239. <slot name="before_info"></slot>
  240. <el-card shadow="never" class="mt-24" style="margin-bottom: 20px;">
  241. <!-- <div slot="header">-->
  242. <!-- <span>基本信息</span>-->
  243. <!-- </div>-->
  244. <el-row>
  245. <el-col :xl="12" :lg="18">
  246. <template>
  247. <el-form-item>
  248. <label slot="label" class="header-require">活动名称</label>
  249. <el-col :span="16">
  250. <el-input v-model="presale_name">
  251. </el-input>
  252. </el-col>
  253. </el-form-item>
  254. <el-form-item label="活动商品" width="120">
  255. <label slot="label" class="header-require">
  256. 活动商品
  257. <el-tooltip class="item" effect="dark" content="只能从商城中获取商品信息,且基本信息与商城商品保持一致" placement="top">
  258. <i class="el-icon-info"></i>
  259. </el-tooltip>
  260. </label>
  261. <div>
  262. <el-row type="flex">
  263. <com-select-goods :multiple="false" :url="goodsIndexUrl" @selected="selectGoodsWarehouse">
  264. <el-button>选择商品</el-button>
  265. </com-select-goods>
  266. </el-row>
  267. </div>
  268. </el-form-item>
  269. <el-form-item v-if="formGoodsList.length>0" label="预售商品">
  270. <div class="table-body" style="padding-left: 0;padding-top: 0;">
  271. <template>
  272. <el-table :data="formGoodsList" border style="width: 100%">
  273. <el-table-column fixed type="index" label="编号" show-overflow-tooltip width="50">
  274. </el-table-column>
  275. <el-table-column prop="goods_name,cover_pic" label="商品名称">
  276. <template slot-scope="scope">
  277. <div flex="box:first">
  278. <div style="padding-right: 10px;">
  279. <com-image mode="aspectFill" :src="scope.row.cover_pic"></com-image>
  280. </div>
  281. <div flex="cross:top cross:center">
  282. {{scope.row.goods_name}}
  283. </div>
  284. </div>
  285. </template>
  286. </el-table-column>
  287. <el-table-column fixed="right" label="操作" width="100">
  288. <template slot-scope="scope">
  289. <el-button @click="delGoods(scope.$index)" type="primary" size="mini">删除</el-button>
  290. </template>
  291. </el-table-column>
  292. </el-table>
  293. </template>
  294. </div>
  295. <template v-if="is_attr > 0 && attrGroups.length > 0">
  296. <com-attr v-model="ruleForm.attr" :attr-groups="attrGroups" :goods-detail="ruleForm" :active-goods-attr="activeGoodsAttr" ref="comAttr"></com-attr>
  297. </template>
  298. </el-form-item>
  299. <!-- <el-form-item label="规格" v-if="is_attr == 0">
  300. <el-row type="flex">
  301. <com-ellipsis :line="1">
  302. <template v-for="item in ruleForm.select_attr_groups">
  303. <span style="margin: 0 5px;">
  304. {{item.attr_group_name}}:{{item.attr_name}}
  305. </span>
  306. </template>
  307. </com-ellipsis>
  308. </el-row>
  309. </el-form-item> -->
  310. <el-form-item prop="cate_id">
  311. <label slot="label" class="header-require">预售分类</label>
  312. <el-select v-model="cate_name" placeholder="请选择" @change="handleChange">
  313. <el-option v-for="item,k in cateList" :key="item.id" :label="item.name" :value="item.id">
  314. </el-option>
  315. </el-select>
  316. </el-form-item>
  317. <el-form-item v-if="is_attr == 0" label="预售价" prop="presale_price">
  318. <el-col :span="8">
  319. <el-input v-model="presale_price">
  320. <template slot="append">元</template>
  321. </el-input>
  322. </el-col>
  323. <br />
  324. <p class="tips-text">预售活动价格,预售金额分为定金+尾款的方式支付。</p>
  325. </el-form-item>
  326. <el-form-item v-if="is_attr == 0" label="定金" prop="deposit_price">
  327. <el-col :span="8">
  328. <el-input v-model="deposit_price">
  329. <template slot="append">元</template>
  330. </el-input>
  331. </el-col>
  332. </br>
  333. </el-form-item>
  334. <el-form-item v-if="is_attr == 0" prop="goods_num">
  335. <label slot="label">
  336. <span>预售库存</span>
  337. </label>
  338. <el-col :span="8">
  339. <el-input type="number" min="0" :max="999999" @input="changeInput" v-model="goods_stock">
  340. <!--oninput="this.value = this.value.replace(/[^0-9\.]/, '');" :disabled="moreAttrs" -->
  341. </el-input>
  342. </el-col>
  343. <br />
  344. <p class="tips-text">商品预售数量,与普通商品库存独立。</p>
  345. </el-form-item>
  346. <el-form-item label="活动时间">
  347. <el-date-picker size="small" v-model="activityDateTime" @change="activityDatetimeChange" type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss" align="center">
  348. </el-date-picker>
  349. </el-form-item>
  350. <el-form-item label="定金支付时间">
  351. <el-date-picker size="small" v-model="depositActiveTime" :picker-options="pickerOptions()" @change="depositDatetimeChange" type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss" align="center">
  352. </el-date-picker>
  353. </el-form-item>
  354. <el-form-item label="尾款支付时间">
  355. <el-date-picker size="small" v-model="activityDateTime" @change="activityDatetimeChange" type="datetimerange" disabled range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss" align="center">
  356. </el-date-picker>
  357. </el-form-item>
  358. <!-- <el-form-item label="尾款支付时间">
  359. <el-date-picker size="small" v-model="finalPaymentActiveTime" @change="finalPaymentDatetimeChange" type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss" align="center">
  360. </el-date-picker>
  361. </el-form-item> -->
  362. <el-form-item label="发货日期">
  363. <el-radio-group v-model="delivery_time_way">
  364. <el-radio :label="0" border>具体日期</el-radio>
  365. </el-date-picker>
  366. <el-radio :label="1" border style="margin-right:8px;">付尾款后</el-radio>
  367. <el-input style="width:100px;" v-model="shipping_days"><template slot="append">天</template></el-input>
  368. </el-form-item>
  369. <el-form-item v-if="delivery_time_way == 0">
  370. <el-date-picker size="small" v-model="sendGoodsTime" @change="sendGoodsDatetimeChange" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" align="center">
  371. </el-form-item>
  372. </el-radio-group>
  373. <!-- <el-form-item label="发货日期">
  374. <el-date-picker size="small" v-model="sendGoodsTime" @change="sendGoodsDatetimeChange" type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss" align="center">
  375. </el-date-picker>
  376. </el-form-item> -->
  377. <el-form-item label="虚拟付款人数:" prop="virtual_payment_num">
  378. <el-col :span="8">
  379. <el-input v-model="virtual_payment_num">
  380. <template slot="append">人</template>
  381. </el-input>
  382. </el-col>
  383. </el-form-item>
  384. <el-form-item label="虚拟已订人数:" prop="virtual_paid_num">
  385. <el-col :span="8">
  386. <el-input v-model="virtual_paid_num">
  387. <template slot="append">人</template>
  388. </el-input>
  389. </el-col>
  390. </el-form-item>
  391. <el-form-item label="限购" v-if="is_attr == 0" prop="purchase_limit_num">
  392. <el-col :span="8">
  393. <el-input v-model="purchase_limit_num">
  394. <template slot="append">件</template>
  395. </el-input>
  396. </el-col>
  397. <br />
  398. <p class="tips-text">本次活动该商品最多可购买多少件,0或空为不限购</p>
  399. </el-form-item>
  400. <el-form-item label="最低起购" prop="minimum_purchase">
  401. <el-col :span="8">
  402. <el-input v-model="minimum_purchase">
  403. <template slot="append">件</template>
  404. </el-input>
  405. </el-col>
  406. <br />
  407. <p class="tips-text">该商品最少购买多少件, 0或空为不限购</p>
  408. </el-form-item>
  409. <!-- <div style="padding-left:20px">
  410. <el-card class="edit-card" shadow="never">
  411. <div slot="header" class="clearfix">
  412. <div class="card-title">预售规则</div>
  413. </div>
  414. <com-rich-text v-model="presale_rules"></com-rich-text>
  415. </el-card>
  416. </div> -->
  417. </template>
  418. </el-col>
  419. </el-row>
  420. </el-card>
  421. </el-tabs>
  422. </el-form>
  423. <div class="bottom-div" flex="cross:center" v-if="is_save_btn == 1" style="margin-top: 10px;">
  424. <el-button class="button-item" :loading="btnLoading" type="primary" size="small" @click="store('ruleForm')" v-if="is_enable_edit == 1">保存
  425. </el-button>
  426. </div>
  427. </div>
  428. </el-card>
  429. </template>
  430. <script>
  431. Vue.component('group-com-goods', {
  432. template: '#abc',
  433. props: {
  434. // // 规格库存
  435. // is_attr: {
  436. // type: Number,
  437. // default: 1
  438. // },
  439. //todo 仅显示售价(抽奖) 秒杀3显示
  440. is_price: {
  441. type: Number,
  442. default: 0
  443. },
  444. // 添加数据接口
  445. store_url: {
  446. type: String,
  447. default: 'deposit-presale/default/add'
  448. },
  449. // 请求数据地址--获取详情
  450. get_goods_detail_url: {
  451. type: String,
  452. default: 'plugin/deposit_presale/mall/index/show'
  453. },
  454. // 保存之后返回地址
  455. referrer: {
  456. default: 'deposit-presale/default/index'
  457. },
  458. // 页面上数据
  459. form: Object,
  460. // 数据验证方式
  461. rule: Object,
  462. is_save_btn: {
  463. type: Number,
  464. default: 1
  465. }
  466. },
  467. data() {
  468. let ruleForm = {
  469. attr: [],
  470. use_attr: 0,
  471. deposit_presale_price: '',
  472. select_attr_groups: [], // 已选择的规格
  473. goodsWarehouse_attrGroups: [], // 商品库商品所有的规格
  474. share_level_type: 0,
  475. presale_rules: '',
  476. delivery_time_way: '',
  477. shipping_days: 0,
  478. goods_name: '',
  479. cover_pic: '',
  480. };
  481. let rules = {
  482. presale_name: [{
  483. required: true,
  484. message: '请输入预售活动名称',
  485. trigger: 'change'
  486. }],
  487. };
  488. return {
  489. id: 0,
  490. value1: '',
  491. goodsIndexUrl: 'deposit-presale/default/goods-list',
  492. formGoodsList: [], //选中的商品数组(最多只能选一个)
  493. moreAttrs: true, //默认选中多规格商品
  494. goods_stock: 0, //预售商品总库存
  495. groupGoodsId: '', //预售商品id
  496. valueDay: '', //添加预售商品开始日期
  497. valueTime: '', //添加预售具体时间
  498. groupStartDate: '', //预售活动开始时刻
  499. groupEndDate: '', //预售活动结束时间
  500. continuedHouse: '', //预售小时数
  501. continuedMinute: '', //预售分钟数
  502. continuedTime: '', //预售活动持续时间
  503. group_size: 0, //成团所需人数
  504. senior_setting: 0, //默认不开启虚拟成团
  505. virtual_group_size: 0, //虚拟成团人数
  506. is_virtual: 0, //是否虚拟成团
  507. sendStatus: 0,
  508. give_score: 0, //团长送积分
  509. give_balance: 0, //团长送余额
  510. send_red_packet: 0, //送红包
  511. limit_buy_num: '', //限制购买数量 0=不限制
  512. goods_id: 0,
  513. cardLoading: false,
  514. btnLoading: false,
  515. activeName: 'first',
  516. ruleForm: ruleForm,
  517. attrGroups: [], //规格组
  518. activeGoodsAttr: [],
  519. dialogCoupon: false,
  520. couponLoading: false,
  521. couponKeyword: '',
  522. coupon_delete: [], //删除了的优惠券数据
  523. coupon_total: 0, //优惠券发放总数
  524. cou_tableData: [],
  525. coupon_data: [],
  526. dialog_total_count: 0,
  527. page: 1,
  528. level_arr: [],
  529. level_index: 0,
  530. level_id: '',
  531. coupon_test: [],
  532. loading: false,
  533. is_coupon_more: false,
  534. staging_arr: [],
  535. activeTime: '',
  536. depositActiveTime: '',
  537. finalPaymentActiveTime: '',
  538. sendGoodsTime: '',
  539. purchase: 2, // 1限购 2不限购
  540. memberLevel: [], //会员等级列表
  541. cateList: [], //分类列表,
  542. cate_name: '',
  543. cate_id: 0,
  544. checkAll: true,
  545. checkAll_C: true,
  546. checkedCities: [],
  547. checkedCities_C: [],
  548. isIndeterminate: false,
  549. isIndeterminate_C: false,
  550. virtual_group_type: 1, //虚拟成团类型 1=全部 2=成团人数大于
  551. gt_group_size: 0, //预售人数大于N,则虚拟成团
  552. isAll: 1, //1指定全部会员购买 2指定等级购买
  553. isAll_C: 1, //1指定全部会员购买 2指定等级购买
  554. presale_name: '', //预售名称
  555. presale_price: 0,
  556. deposit_price: 0,
  557. virtual_payment_num: 0,
  558. virtual_paid_num: 0,
  559. purchase_limit_num: 0,
  560. presale_rules: '',
  561. delivery_time_way: 0,
  562. shipping_days: 0,
  563. is_attr: 0,
  564. minimum_purchase: 0,
  565. deposit_start_at: '',
  566. deposit_end_at: '',
  567. final_payment_start_at: '',
  568. final_payment_end_at: '',
  569. activity_start_at: '',
  570. activity_end_at: '',
  571. activityDateTime: '',
  572. // pickerOptions: {
  573. // disabledDate(time) {
  574. // console.log(this.activityDateTime);
  575. // let that = this
  576. // return time.getTime() < Date.parse(new Date(this.activity_start_at.replace(/-/g, '/')));
  577. // }
  578. // },
  579. is_enable_edit: 1,
  580. };
  581. },
  582. created() {
  583. if (getQuery('id')) {
  584. this.getGoodsList(getQuery('id'));
  585. this.goods_id = getQuery('id');
  586. }
  587. this.getGroupCateList();
  588. if (getQuery('activity_id')) {
  589. this.getActivityDetail(getQuery('activity_id'));
  590. }
  591. },
  592. watch: {
  593. 'ruleForm.detail'(newVal, oldVal) {
  594. this.cForm.detail = newVal
  595. },
  596. 'attrGroups'(newVal, oldVal) {
  597. this.ruleForm.use_attr = newVal.length === 0 ? 0 : 1;
  598. },
  599. 'ruleForm.is_level'(newVal, oldVal) {
  600. if (newVal === 0) {
  601. this.ruleForm.is_level_alone = 0;
  602. }
  603. },
  604. },
  605. // 这里有用到计算属性
  606. computed: {
  607. cForm() {
  608. let form = {};
  609. let ruleForm = JSON.parse(JSON.stringify(this.ruleForm));
  610. if (this.form) {
  611. form = Object.assign(ruleForm, JSON.parse(JSON.stringify(this.form)));
  612. } else {
  613. form = ruleForm;
  614. }
  615. if (getQuery('id')) {
  616. form.id = getQuery('id')
  617. }
  618. return form;
  619. },
  620. cRule() {
  621. return this.rules;
  622. },
  623. },
  624. methods: {
  625. pickerOptions() {
  626. let self = this;
  627. return {
  628. disabledDate(time) {
  629. let duration_result = time.getTime() < Date.parse(new Date(self.activity_start_at.replace(/-/g, '/')))
  630. || time.getTime() > Date.parse(new Date(self.activity_end_at.replace(/-/g, '/')));
  631. return duration_result;
  632. },
  633. }
  634. },
  635. changeInput() {
  636. var pattern = /^[1-9][0-9]*$/ // 正整数的正则表达式
  637. // 不符合正整数时
  638. if (!pattern.test(this.goods_stock)) {
  639. // input 框绑定的内容为空
  640. this.goods_stock = ''
  641. }
  642. },
  643. changeInput2() {
  644. var pattern = /^[0-9][0-9]*$/ // 正整数的正则表达式
  645. // 不符合正整数时
  646. if (!pattern.test(this.continuedHouse)) {
  647. // input 框绑定的内容为空
  648. this.continuedHouse = ''
  649. }
  650. },
  651. changeInput3() {
  652. var pattern = /^[0-9][0-9]*$/ // 正整数的正则表达式
  653. // 不符合正整数时
  654. if (!pattern.test(this.continuedMinute)) {
  655. // input 框绑定的内容为空
  656. this.continuedMinute = ''
  657. }
  658. },
  659. handleCheckAllChange(val) {
  660. let arr = [];
  661. this.memberLevel.forEach((item) => {
  662. arr.push(item.level)
  663. })
  664. this.checkedCities = val ? arr : [];
  665. this.isIndeterminate = false;
  666. },
  667. handleCheckAllChange_C(val) {
  668. let arr = [];
  669. this.memberLevel.forEach((item) => {
  670. arr.push(item.level)
  671. })
  672. this.checkedCities_C = val ? arr : [];
  673. this.isIndeterminate_C = false;
  674. },
  675. handleCheckedCitiesChange(value) {
  676. let checkedCount = value.length;
  677. this.checkAll = checkedCount === this.memberLevel.length;
  678. this.isIndeterminate = checkedCount > 0 && checkedCount < this.memberLevel.length;
  679. },
  680. handleCheckedCitiesChange_C(value) {
  681. let checkedCount = value.length;
  682. this.checkAll_C = checkedCount === this.memberLevel.length;
  683. this.isIndeterminate_C = checkedCount > 0 && checkedCount < this.memberLevel.length;
  684. },
  685. getGroupCateList() {
  686. let self = this;
  687. request({
  688. params: {
  689. r: 'deposit-presale/default/cate-list',
  690. page: 1,
  691. },
  692. method: 'get',
  693. }).then(e => {
  694. if (e.data.code === 0) {
  695. this.cateList = e.data.data.list;
  696. } else {
  697. self.$message.error(e.data.msg);
  698. }
  699. }).catch(e => {
  700. console.log(e);
  701. });
  702. },
  703. datetimeChange() {
  704. if (this.activeTime) {
  705. this.start_at = this.activeTime[0];
  706. this.end_at = this.activeTime[1];
  707. } else {
  708. this.start_at = '';
  709. this.end_at = '';
  710. }
  711. },
  712. depositDatetimeChange() {
  713. if (this.depositActiveTime) {
  714. this.deposit_start_at = this.depositActiveTime[0];
  715. this.deposit_end_at = this.depositActiveTime[1];
  716. } else {
  717. this.deposit_start_at = '';
  718. this.deposit_end_at = '';
  719. }
  720. },
  721. finalPaymentDatetimeChange() {
  722. if (this.finalPaymentActiveTime) {
  723. this.final_payment_start_at = this.finalPaymentActiveTime[0];
  724. this.final_payment_end_at = this.finalPaymentActiveTime[1];
  725. } else {
  726. this.final_payment_start_at = '';
  727. this.final_payment_end_at = '';
  728. }
  729. },
  730. activityDatetimeChange() {
  731. if (this.activityDateTime) {
  732. this.activity_start_at = this.activityDateTime[0];
  733. this.activity_end_at = this.activityDateTime[1];
  734. } else {
  735. this.activity_start_at = '';
  736. this.activity_end_at = '';
  737. }
  738. },
  739. sendGoodsDatetimeChange() {
  740. if (this.sendGoodsTime) {
  741. this.send_goods_start_at = this.sendGoodsTime;
  742. // this.send_goods_end_at = this.sendGoodsTime[1];
  743. } else {
  744. this.send_goods_start_at = '';
  745. // this.send_goods_end_at = '';
  746. }
  747. },
  748. //预售活动时间设置
  749. setActivityTime(params) {
  750. let begin = params[0];
  751. let end = params[1];
  752. self.groupStartDate = dateFormat('YYYY-mm-dd HH:MM:SS', begin);
  753. self.groupEndDate = dateFormat('YYYY-mm-dd HH:MM:SS', end);
  754. console.log(self.groupStartDate, self.groupEndDate)
  755. },
  756. // 0.0.1 删除选中商品
  757. delGoods() {
  758. this.formGoodsList = [];
  759. this.goods_warehouse = {};
  760. location.reload(); //刷新当前页
  761. },
  762. // 0.1 获取预售开始时间 2020-08-07 00:00:00
  763. getGroupStartDate(valueDay, valueTime) {
  764. let self = this;
  765. self.groupStartDate = valueDay + ' ' + valueTime;
  766. },
  767. // 0.2 获取预售持续分钟数 -''做乘法运算返回0
  768. getContinuedTime(continuedHouse, continuedMinute) {
  769. let self = this;
  770. self.continuedTime = continuedHouse * 60 + continuedMinute * 1;
  771. console.log(self.continuedTime);
  772. },
  773. store(formName) {
  774. self = this;
  775. let total_stock = 0
  776. // let deposit_start = new Date(self.deposit_start_at.replace(/-/g, '/'));
  777. // let deposit_start_time = Date.parse(deposit_start);
  778. // let deposit_end = new Date(self.deposit_end_at.replace(/-/g, '/'));
  779. // let deposit_end_time = Date.parse(deposit_end);
  780. // let final_payment_start = new Date(self.final_payment_start_at.replace(/-/g, '/'));
  781. // let final_payment_start_time = Date.parse(final_payment_start);
  782. // let final_payment_end = new Date(self.final_payment_end_at.replace(/-/g, '/'));
  783. // let final_payment_end_time = Date.parse(final_payment_end);
  784. // let activity_start = new Date(self.activity_start_at.replace(/-/g, '/'));
  785. // let activity_start_time = Date.parse(activity_start);
  786. // let activity_end = new Date(self.activity_end_at.replace(/-/g, '/'));
  787. // let activity_end_time = Date.parse(activity_end);
  788. // if (activity_start_time > deposit_start_time) {
  789. // self.$message.error("支付定金开始时间不能早于活动开始时间哦");
  790. // return false;
  791. // }
  792. // if (activity_start_time > final_payment_start_time) {
  793. // self.$message.error("支付尾款开始时间不能早于活动开始时间哦");
  794. // return false;
  795. // }
  796. // if (deposit_start_time > final_payment_start_time) {
  797. // self.$message.error("支付定金开始时间不能早于支付尾款开始时间哦");
  798. // return false;
  799. // }
  800. // if (final_payment_end_time > activity_end_time) {
  801. // self.$message.error("支付尾款结束时间不能晚于活动结束时间哦");
  802. // return false;
  803. // }
  804. // if (deposit_end_time > activity_end_time) {
  805. // self.$message.error("支付定金结束时间不能晚于活动结束时间哦");
  806. // return false;
  807. // }
  808. // if (!self.groupGoodsId) {
  809. // self.$message.error("请选择商品,好吗?");
  810. // return false;
  811. // }
  812. let commander_level_limit;
  813. let user_level_limit;
  814. if (this.isAll == 1) {
  815. user_level_limit = 'all';
  816. } else if (this.isAll == 2) {
  817. user_level_limit = this.checkedCities.join(',')
  818. }
  819. if (this.isAll_C == 1) {
  820. commander_level_limit = 'all';
  821. } else if (this.isAll_C == 2) {
  822. commander_level_limit = this.checkedCities_C.join(',')
  823. }
  824. if (self.is_attr == 1) {
  825. self.cForm.select_attr_groups = this.$refs.comAttr.value;
  826. }
  827. let deposit_presale_goods = {
  828. "id": self.id,
  829. "cate_id": self.cate_id,
  830. "start_at": self.start_at, //开始时间
  831. "end_at": self.end_at, //结束时间
  832. "deposit_start_at": self.deposit_start_at, //定金开始时间
  833. "deposit_end_at": self.deposit_end_at, //定金结束时间
  834. "final_payment_start_at": self.activity_start_at, //尾款开始时间
  835. "final_payment_end_at": self.activity_end_at, //尾款结束时间
  836. "send_goods_start_at": self.delivery_time_way == 0 ? self.send_goods_start_at : 0, //发货开始时间
  837. "send_goods_end_at": self.send_goods_end_at, //发货结束时间
  838. "effective_time": self.continuedTime, //有效时间分钟数
  839. "group_size": self.group_size, //成团人数
  840. "virtual_group_size": self.virtual_group_size, //虚拟成团人数
  841. "is_virtual": self.is_virtual, //是否虚拟成团
  842. "goods_id": self.groupGoodsId, //商品id
  843. "goods_stock": self.goods_stock, //预售商品总库存
  844. "limit_buy_num": self.purchase == 2 ? 0 : self.limit_buy_num, //购买数量限制 0=不限制
  845. 'commander_level_limit': commander_level_limit, //团长等级限制 或者全部用户all
  846. 'user_level_limit': user_level_limit, //团员等级限制 或者全部用户all
  847. "virtual_group_type": self.virtual_group_type, //虚拟成团类型 1=全部 2=成团人数大于
  848. "gt_group_size": self.gt_group_size, //预售人数大于N,则虚拟成团,
  849. "presale_name": self.presale_name, //活动名称
  850. "presale_price": self.presale_price, //预售价
  851. "deposit_price": self.deposit_price, //定金
  852. "virtual_payment_num": self.virtual_payment_num, //虚拟付款人数
  853. "virtual_paid_num": self.virtual_paid_num, //虚拟已付款人数
  854. "purchase_limit_num": self.purchase_limit_num, //限购
  855. "presale_rules": self.presale_rules, //限购
  856. "delivery_time_way": self.delivery_time_way,
  857. "shipping_days": self.shipping_days,
  858. "is_attr": self.is_attr,
  859. "minimum_purchase": self.minimum_purchase,
  860. "activity_start_at": self.activity_start_at,
  861. "activity_end_at": self.activity_end_at,
  862. };
  863. switch (self.sendStatus) {
  864. case 1:
  865. deposit_presale_goods['give_score'] = self.give_score;
  866. break;
  867. case 2:
  868. deposit_presale_goods['give_balance'] = self.give_balance
  869. break;
  870. case 3:
  871. deposit_presale_goods['send_red_packet'] = self.send_red_packet
  872. break;
  873. }
  874. // 如果是单规格商品
  875. request({
  876. params: {
  877. r: this.store_url
  878. },
  879. method: 'post',
  880. data: {
  881. deposit_presale_goods: deposit_presale_goods,
  882. form: self.cForm
  883. }
  884. }).then(e => {
  885. self.btnLoading = false;
  886. self.goods_stock = 0;
  887. if (e.data.code === 0) {
  888. //保存成功
  889. // console.log()
  890. self.$message.success(e.data.msg);
  891. navigateTo({
  892. r: this.referrer,
  893. })
  894. } else {
  895. self.$message.error(e.data.msg);
  896. }
  897. }).catch(e => {
  898. console.log(e);
  899. });
  900. },
  901. validate() {
  902. let self = this;
  903. try {
  904. return true;
  905. } catch (error) {
  906. self.$message.error(error.message);
  907. return false;
  908. }
  909. },
  910. // 设置获取到的预售商品信息
  911. setDepositPresaleGoodsData(groupBuyGoods) {
  912. let self = this;
  913. let timeArr = groupBuyGoods.start_at.trim().split(" ");
  914. self.valueDay = timeArr[0];
  915. self.valueTime = timeArr[1];
  916. // console.log(valueDay+'111'+valueTime);
  917. self.continuedHouse = parseInt(groupBuyGoods.vaild_time / 60);
  918. self.continuedMinute = groupBuyGoods.vaild_time % 60;
  919. self.group_size = groupBuyGoods.people;
  920. self.is_virtual = groupBuyGoods.is_virtual;
  921. self.virtual_group_size = groupBuyGoods.virtual_group_size;
  922. },
  923. // 获取详情数据
  924. getGoodsList(id, url = '') {
  925. let self = this;
  926. // 存一下商品的id
  927. self.groupGoodsId = id;
  928. self.cardLoading = true;
  929. request({
  930. params: {
  931. r: url ? url : this.get_goods_detail_url,
  932. id: id,
  933. },
  934. method: 'get',
  935. }).then(e => {
  936. self.cardLoading = false;
  937. if (e.data.code == 0) { //状态码判断是否请求成功
  938. let detail = e.data.data.detail;
  939. detail.attr.length > 1 ? self.moreAttrs = true : self.moreAttrs = false; //是否选中多规格商品
  940. console.log('detail:', detail);
  941. if (self.formGoodsList.length > 0) {
  942. this.goods_warehouse = {};
  943. }
  944. // 存一下商品的列表显示信息
  945. let formGoods = {};
  946. formGoods['goods_name'] = detail.goods_name;
  947. formGoods['cover_pic'] = detail.cover_pic;
  948. let formGoodsArr = [];
  949. formGoodsArr.push(formGoods);
  950. self.formGoodsList = formGoodsArr;
  951. if (e.data.data.deposit_presale_goods) {
  952. let groupBuyGoods = e.data.data.deposit_presale_goods;
  953. self.setDepositPresaleGoodsData(groupBuyGoods);
  954. }
  955. console.log(detail);
  956. if (detail['use_attr'] === 0) { //单规格
  957. detail['attr_groups'] = [];
  958. }
  959. if (this.form && this.form.extra) {
  960. for (let i in this.form.extra) {
  961. if (detail.use_attr == 1) {
  962. for (let j in detail.attr) {
  963. if (!detail.attr[j][i]) {
  964. detail.attr[j][i] = 0;
  965. }
  966. }
  967. }
  968. Vue.set(self.ruleForm, i, 0);
  969. }
  970. }
  971. if (detail.is_attr == 1) {
  972. this.is_attr = 1;
  973. } else {
  974. if (this.is_attr == 1) {
  975. this.is_attr = 0;
  976. }
  977. }
  978. self.ruleForm = Object.assign(self.ruleForm, detail);
  979. // 初始化一下规格
  980. self.attrGroups = e.data.data.detail.attr_groups;
  981. if (self.is_attr == 0) {
  982. self.ruleForm.deposit_presale_price = detail.attr[0].deposit_presale_price;
  983. }
  984. } else {
  985. self.$message.error(e.data.msg);
  986. }
  987. }).catch(e => {
  988. self.cardLoading = false;
  989. console.log(e);
  990. });
  991. },
  992. // 获取详情数据
  993. getActivityDetail(id) {
  994. let self = this;
  995. // 存一下商品的id
  996. // self.groupGoodsId = id;
  997. self.cardLoading = true;
  998. request({
  999. params: {
  1000. r: 'deposit-presale/default/add',
  1001. id: id,
  1002. },
  1003. method: 'get',
  1004. }).then(e => {
  1005. self.cardLoading = false;
  1006. if (e.data.code == 0) { //状态码判断是否请求成功
  1007. let activity = e.data.data;
  1008. if(e.data.data.status == -1 || e.data.data.group_status == 2){
  1009. this.is_enable_edit = 0;
  1010. }
  1011. if (activity) {
  1012. for (let key in this.$data) {
  1013. if (key in activity) {
  1014. this.$data[key] = activity[key];
  1015. }
  1016. }
  1017. this.getGoodsList(activity.goods_id, 'deposit-presale/default/goods-detail');
  1018. console.log(this.$data);
  1019. }
  1020. } else {
  1021. self.$message.error(e.data.msg);
  1022. }
  1023. }).catch(e => {
  1024. self.cardLoading = false;
  1025. console.log(e);
  1026. });
  1027. },
  1028. handleChange(value) {
  1029. this.cate_id = value;
  1030. },
  1031. // 选择商品(清空弹窗已有商品)
  1032. selectGoodsWarehouse(goods_warehouse) {
  1033. if (goods_warehouse.goods_stock <= 0) {
  1034. this.$message.error('该商品的库存为0,请重新选择商品');
  1035. return
  1036. }
  1037. this.ruleForm.select_attr_groups = [];
  1038. this.getGoodsList(goods_warehouse.id, 'deposit-presale/default/goods-detail')
  1039. },
  1040. },
  1041. });
  1042. </script>