This commit is contained in:
liqianjin 2024-09-18 13:34:33 +08:00
commit 2d1849a84b
13788 changed files with 1810813 additions and 0 deletions

6
.env Normal file
View File

@ -0,0 +1,6 @@
APP_DEBUG = true
APP_TRACE = false
[APP]
DEFAULT_TIMEZONE = Asia/Shanghai
[LANG]
default_lang = zh-cn

22
.gitignore vendored Normal file
View File

@ -0,0 +1,22 @@
/.project
/.vscode
/.settings
/.idea
/.htaccess
/.buildpath
*.log
*.txt
/h5
/web
/mshop
/cashregister
.ai
/runtime/
/cloud.sopvip.com20231211bak.zip
/config/
/nginxcon
/app/shop/controller/Test.php
/extend/miniprogram-ci/key/
/extend/miniprogram-ci/code/
/extend/miniprogram-ci/qrcode/
/addon/dividemoney-bak/

42
.travis.yml Normal file
View File

@ -0,0 +1,42 @@
sudo: false
language: php
branches:
only:
- stable
cache:
directories:
- $HOME/.composer/cache
before_install:
- composer self-update
install:
- composer install --no-dev --no-interaction --ignore-platform-reqs
- zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Core.zip .
- composer require --update-no-dev --no-interaction "topthink/think-image:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-migration:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-captcha:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-mongo:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-worker:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-helper:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-queue:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-angular:^1.0"
- composer require --dev --update-no-dev --no-interaction "topthink/think-testing:^1.0"
- zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Full.zip .
script:
- php think unit
deploy:
provider: releases
api_key:
secure: TSF6bnl2JYN72UQOORAJYL+CqIryP2gHVKt6grfveQ7d9rleAEoxlq6PWxbvTI4jZ5nrPpUcBUpWIJHNgVcs+bzLFtyh5THaLqm39uCgBbrW7M8rI26L8sBh/6nsdtGgdeQrO/cLu31QoTzbwuz1WfAVoCdCkOSZeXyT/CclH99qV6RYyQYqaD2wpRjrhA5O4fSsEkiPVuk0GaOogFlrQHx+C+lHnf6pa1KxEoN1A0UxxVfGX6K4y5g4WQDO5zT4bLeubkWOXK0G51XSvACDOZVIyLdjApaOFTwamPcD3S1tfvuxRWWvsCD5ljFvb2kSmx5BIBNwN80MzuBmrGIC27XLGOxyMerwKxB6DskNUO9PflKHDPI61DRq0FTy1fv70SFMSiAtUv9aJRT41NQh9iJJ0vC8dl+xcxrWIjU1GG6+l/ZcRqVx9V1VuGQsLKndGhja7SQ+X1slHl76fRq223sMOql7MFCd0vvvxVQ2V39CcFKao/LB1aPH3VhODDEyxwx6aXoTznvC/QPepgWsHOWQzKj9ftsgDbsNiyFlXL4cu8DWUty6rQy8zT2b4O8b1xjcwSUCsy+auEjBamzQkMJFNlZAIUrukL/NbUhQU37TAbwsFyz7X0E/u/VMle/nBCNAzgkMwAUjiHM6FqrKKBRWFbPrSIixjfjkCnrMEPw=
file:
- ThinkPHP_Core.zip
- ThinkPHP_Full.zip
skip_cleanup: true
on:
tags: true

26
404.html Normal file
View File

@ -0,0 +1,26 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>404</title>
<style>
body{
background-color:#444;
font-size:14px;
}
h3{
font-size:60px;
color:#eee;
text-align:center;
padding-top:30px;
font-weight:normal;
}
</style>
</head>
<body>
<h3>404您请求的文件不存在!</h3>
</body>
</html>

View File

@ -0,0 +1,139 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\activity\api\controller;
use app\api\controller\BaseApi;
use app\api\controller\Goodssku;
use addon\activity\model\ActivityModel;
use addon\activity\model\Poster;
/**
* 团购商品
*/
class Goods extends BaseApi
{
/**
* 活动商品详情信息
*/
public function detail()
{
$activity_id = isset($this->params[ 'id' ]) ? $this->params[ 'id' ] : 0;
if (empty($activity_id)) {
return $this->response($this->error('', '活动不存在活已过期'));
}
$groupbuy_model = new ActivityModel();
$condition = [
[ 'activity_id', '=', $activity_id ],
[ 'site_id', '=', $this->site_id ],
];
$goods_sku_detail = $groupbuy_model->getActivityInfo($condition)[ 'data' ];
if (empty($goods_sku_detail)) return $this->response($this->error());
$goods_sku_detail['goods_name']='这个超级优惠券';
$goods_sku_detail['sku_images']=$goods_sku_detail['activity_image'];
$goods_sku_detail['goods_service_ids']=[];
$goods_sku_detail['goods_content']=$goods_sku_detail['content'];
$goods_sku_detail['goods_stock']=9999;
$goods_sku_detail['goods_state']=1;
$res[ 'goods_sku_detail' ] = $goods_sku_detail;
// 处理公共数据
$goods_sku_api = new Goodssku();
$goods_sku_api->handleGoodsDetailData($res[ 'goods_sku_detail' ]);
return $this->response($this->success($res));
}
/**
* 查询商品SKU集合
* @return false|string
*/
public function goodsSku()
{
$goods_id = isset($this->params[ 'goods_id' ]) ? $this->params[ 'goods_id' ] : 0;
$groupbuy_id = isset($this->params[ 'groupbuy_id' ]) ? $this->params[ 'groupbuy_id' ] : 0;
if (empty($goods_id)) {
return $this->response($this->error('', 'REQUEST_ID'));
}
if (empty($groupbuy_id)) {
return $this->response($this->error('', 'REQUEST_GROUPBUY_ID'));
}
$groupbuy_model = new GroupbuyModel();
$condition = [
[ 'pg.groupbuy_id', '=', $groupbuy_id ],
[ 'pg.site_id', '=', $this->site_id ],
[ 'g.goods_id', '=', $goods_id ],
[ 'g.goods_state', '=', 1 ],
[ 'g.is_delete', '=', 0 ]
];
$list = $groupbuy_model->getGroupbuyGoodsSkuList($condition, null);
return $this->response($list);
}
public function page()
{
$page = isset($this->params[ 'page' ]) ? $this->params[ 'page' ] : 1;
$page_size = isset($this->params[ 'page_size' ]) ? $this->params[ 'page_size' ] : PAGE_LIST_ROWS;
$goods_id_arr = isset($this->params[ 'goods_id_arr' ]) ? $this->params[ 'goods_id_arr' ] : '';//goods_id数组
$condition = [
[ 'pg.status', '=', 2 ],// 状态1未开始 2进行中 3已结束
[ 'g.goods_stock', '>', 0 ],
[ 'g.goods_state', '=', 1 ],
[ 'g.is_delete', '=', 0 ],
[ 'sku.site_id', '=', $this->site_id ]
];
if (!empty($goods_id_arr)) {
$condition[] = [ 'sku.goods_id', 'in', $goods_id_arr ];
}
$groupbuy_model = new GroupbuyModel();
$list = $groupbuy_model->getGroupbuyGoodsPageList($condition, $page, $page_size, 'pg.groupbuy_id desc');
return $this->response($list);
}
public function lists()
{
$num = isset($this->params[ 'num' ]) ? $this->params[ 'num' ] : 0;
$condition = [
[ 'pg.status', '=', 2 ],// 状态1未开始 2进行中 3已结束
[ 'g.goods_stock', '>', 0 ],
[ 'g.goods_state', '=', 1 ],
[ 'g.is_delete', '=', 0 ],
[ 'sku.site_id', '=', $this->site_id ]
];
if (!empty($goods_id_arr)) {
$condition[] = [ 'sku.goods_id', 'in', $goods_id_arr ];
}
$groupbuy_model = new GroupbuyModel();
$list = $groupbuy_model->getGroupbuyGoodsList($condition, '', 'pg.groupbuy_id desc', $num);
return $this->response($list);
}
/**
* 获取商品海报
*/
public function poster()
{
$this->checkToken();
$promotion_type = 'groupbuy';
$qrcode_param = json_decode($this->params[ 'qrcode_param' ], true);
$qrcode_param[ 'source_member' ] = $this->member_id;
$qrcode_param[ 'id' ] = $qrcode_param[ 'groupbuy_id' ] ?? 0;
unset($qrcode_param[ 'groupbuy_id' ]);
$poster = new Poster();
$res = $poster->goods($this->params[ 'app_type' ], $this->params[ 'page' ], $qrcode_param, $promotion_type, $this->site_id);
return $this->response($res);
}
}

View File

@ -0,0 +1,189 @@
<?php
/**
* Index.php
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2023-2033 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
* @author : small
* @date : 2022.8.8
* @version : v5.0.0.1
*/
namespace addon\activity\api\controller;
use app\api\controller\BaseApi;
use addon\activity\model\GroupbuyOrderCreate as OrderCreateModel;
/**
* 订单创建
* @author Administrator
*
*/
class Ordercreate extends BaseApi
{
/**
* 创建订单
*/
public function create()
{
$token = $this->checkToken();
if ($token[ 'code' ] < 0) return $this->response($token);
$order_create = new OrderCreateModel();
$data = [
'groupbuy_id' => isset($this->params[ 'groupbuy_id' ]) ? $this->params[ 'groupbuy_id' ] : '',//团购id
'num' => isset($this->params[ 'num' ]) ? $this->params[ 'num' ] : 1,//商品数量(买几套)
'sku_id' => isset($this->params[ 'sku_id' ]) ? $this->params[ 'sku_id' ] : 0,//sku_id
'site_id' => $this->site_id,//站点id
'member_id' => $this->member_id,
'is_balance' => isset($this->params[ 'is_balance' ]) ? $this->params[ 'is_balance' ] : 0,//是否使用余额
'pay_password' => isset($this->params[ 'pay_password' ]) ? $this->params[ 'pay_password' ] : '',//支付密码
'order_from' => $this->params[ 'app_type' ],
'order_from_name' => $this->params[ 'app_type_name' ],
'buyer_message' => $this->params[ 'buyer_message' ] ?? '',
'delivery' => isset($this->params[ "delivery" ]) && !empty($this->params[ "delivery" ]) ? json_decode($this->params[ "delivery" ], true) : [],
'member_address' => isset($this->params[ "member_address" ]) && !empty($this->params[ "member_address" ]) ? json_decode($this->params[ "member_address" ], true) : [],
'latitude' => $this->params[ "latitude" ] ?? '',
'longitude' => $this->params[ "longitude" ] ?? '',
'is_invoice' => $this->params[ "is_invoice" ] ?? 0,
'invoice_type' => $this->params[ "invoice_type" ] ?? 0,
'invoice_title' => $this->params[ "invoice_title" ] ?? '',
'taxpayer_number' => $this->params[ "taxpayer_number" ] ?? '',
'invoice_content' => $this->params[ "invoice_content" ] ?? '',
'invoice_full_address' => $this->params[ "invoice_full_address" ] ?? '',
'is_tax_invoice' => $this->params[ "is_tax_invoice" ] ?? 0,
'invoice_email' => $this->params[ "invoice_email" ] ?? '',
'invoice_title_type' => $this->params[ "invoice_title_type" ] ?? 0,
'buyer_ask_delivery_time' => $this->params[ "buyer_ask_delivery_time" ] ?? '',
'form_data' => isset($this->params[ "form_data" ]) && !empty($this->params[ "form_data" ]) ? json_decode($this->params[ "form_data" ], true) : [],
];
if (empty($data[ 'sku_id' ]) || empty($data[ 'groupbuy_id' ])) {
return $this->response($this->error('', '缺少必填参数商品数据'));
}
if ($data[ 'num' ] < 1) {
return $this->response($this->error('', '购买数量不能小于1'));
}
$res = $order_create->create($data);
return $this->response($res);
}
/**
* 门店自提情况下提交订单验证地址和门店库存
*/
public function verifyAreaOrStock()
{
$token = $this->checkToken();
if ($token[ 'code' ] < 0) return $this->response($token);
$order_create = new OrderCreateModel();
$data = [
'groupbuy_id' => isset($this->params[ 'groupbuy_id' ]) ? $this->params[ 'groupbuy_id' ] : '',//团购id
'num' => isset($this->params[ 'num' ]) ? $this->params[ 'num' ] : 1,//商品数量(买几套)
'sku_id' => isset($this->params[ 'sku_id' ]) ? $this->params[ 'sku_id' ] : 0,//sku_id
'site_id' => $this->site_id,//站点id
'member_id' => $this->member_id,
'is_balance' => isset($this->params[ 'is_balance' ]) ? $this->params[ 'is_balance' ] : 0,//是否使用余额
'pay_password' => isset($this->params[ 'pay_password' ]) ? $this->params[ 'pay_password' ] : '',//支付密码
'order_from' => $this->params[ 'app_type' ],
'order_from_name' => $this->params[ 'app_type_name' ],
'buyer_message' => $this->params[ 'buyer_message' ] ?? '',
'delivery' => isset($this->params[ "delivery" ]) && !empty($this->params[ "delivery" ]) ? json_decode($this->params[ "delivery" ], true) : [],
'member_address' => isset($this->params[ "member_address" ]) && !empty($this->params[ "member_address" ]) ? json_decode($this->params[ "member_address" ], true) : [],
'latitude' => $this->params[ "latitude" ] ?? '',
'longitude' => $this->params[ "longitude" ] ?? '',
'is_invoice' => $this->params[ "is_invoice" ] ?? 0,
'invoice_type' => $this->params[ "invoice_type" ] ?? 0,
'invoice_title' => $this->params[ "invoice_title" ] ?? '',
'taxpayer_number' => $this->params[ "taxpayer_number" ] ?? '',
'invoice_content' => $this->params[ "invoice_content" ] ?? '',
'invoice_full_address' => $this->params[ "invoice_full_address" ] ?? '',
'is_tax_invoice' => $this->params[ "is_tax_invoice" ] ?? 0,
'invoice_email' => $this->params[ "invoice_email" ] ?? '',
'invoice_title_type' => $this->params[ "invoice_title_type" ] ?? 0,
'buyer_ask_delivery_time' => $this->params[ "buyer_ask_delivery_time" ] ?? '',
];
if (empty($data[ 'sku_id' ]) || empty($data[ 'groupbuy_id' ])) {
return $this->response($this->error('', '缺少必填参数商品数据'));
}
$res = $order_create->verifyAreaOrStock($data);
return $this->response($res);
}
/**
* 计算信息
*/
public function calculate()
{
$token = $this->checkToken();
if ($token[ 'code' ] < 0) return $this->response($token);
$order_create = new OrderCreateModel();
$data = [
'groupbuy_id' => isset($this->params[ 'groupbuy_id' ]) ? $this->params[ 'groupbuy_id' ] : '',//团购id
'num' => isset($this->params[ 'num' ]) ? $this->params[ 'num' ] : 1,//商品数量(买几套)
'sku_id' => isset($this->params[ 'sku_id' ]) ? $this->params[ 'sku_id' ] : 0,//sku_id
'member_id' => $this->member_id,
'site_id' => $this->site_id,//站点id
'is_balance' => isset($this->params[ 'is_balance' ]) ? $this->params[ 'is_balance' ] : 0,//是否使用余额
'order_from' => $this->params[ 'app_type' ],
'order_from_name' => $this->params[ 'app_type_name' ],
'delivery' => isset($this->params[ "delivery" ]) && !empty($this->params[ "delivery" ]) ? json_decode($this->params[ "delivery" ], true) : [],
'member_address' => isset($this->params[ "member_address" ]) && !empty($this->params[ "member_address" ]) ? json_decode($this->params[ "member_address" ], true) : [],
'latitude' => $this->params[ "latitude" ] ?? '',
'longitude' => $this->params[ "longitude" ] ?? '',
'is_invoice' => $this->params[ "is_invoice" ] ?? 0,
'invoice_type' => $this->params[ "invoice_type" ] ?? 0,
'invoice_title' => $this->params[ "invoice_title" ] ?? '',
'taxpayer_number' => $this->params[ "taxpayer_number" ] ?? '',
'invoice_content' => $this->params[ "invoice_content" ] ?? '',
'invoice_full_address' => $this->params[ "invoice_full_address" ] ?? '',
'is_tax_invoice' => $this->params[ "is_tax_invoice" ] ?? 0,
'invoice_email' => $this->params[ "invoice_email" ] ?? '',
'invoice_title_type' => $this->params[ "invoice_title_type" ] ?? 0,
'buyer_ask_delivery_time' => $this->params[ "buyer_ask_delivery_time" ] ?? '',
];
if (empty($data[ 'sku_id' ]) || empty($data[ 'groupbuy_id' ])) {
return $this->response($this->error('', '缺少必填参数商品数据'));
}
$res = $order_create->calculate($data);
return $this->response($this->success($res));
}
/**
* 待支付订单 数据初始化
* @return string
*/
public function payment()
{
$token = $this->checkToken();
if ($token[ 'code' ] < 0) return $this->response($token);
$order_create = new OrderCreateModel();
$data = [
'groupbuy_id' => isset($this->params[ 'groupbuy_id' ]) ? $this->params[ 'groupbuy_id' ] : '',//团购id
'num' => isset($this->params[ 'num' ]) ? $this->params[ 'num' ] : 1,//商品数量(买几套)
'sku_id' => isset($this->params[ 'sku_id' ]) ? $this->params[ 'sku_id' ] : 0,//sku_id
'member_id' => $this->member_id,
'site_id' => $this->site_id,//站点id
'is_balance' => isset($this->params[ 'is_balance' ]) ? $this->params[ 'is_balance' ] : 0,//是否使用余额
'order_from' => $this->params[ 'app_type' ],
'order_from_name' => $this->params[ 'app_type_name' ],
'latitude' => $this->params[ "latitude" ] ?? '',
'longitude' => $this->params[ "longitude" ] ?? '',
'default_store_id' => $this->params[ "default_store_id" ] ?? 0,
];
if (empty($data[ 'sku_id' ]) || empty($data[ 'groupbuy_id' ])) {
return $this->response($this->error('', '缺少必填参数商品数据'));
}
$res = $order_create->orderPayment($data);
return $this->response($this->success($res));
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace addon\activity\component\controller;
use app\component\controller\BaseDiyView;
/**
* 团购模块·组件
*
*/
class Groupbuy extends BaseDiyView
{
/**
* 设计界面
*/
public function design()
{
return $this->fetch("groupbuy/design.html");
}
}

View File

@ -0,0 +1,29 @@
@CHARSET "UTF-8";
/* 样式:单列 */
.component-groupbuy .groupbuy-list .row1-of1{}
.component-groupbuy .groupbuy-list .row1-of1 .item{display: flex;margin-bottom: 10px;padding: 8px;}
.component-groupbuy .groupbuy-list .row1-of1 .item:last-child{margin-bottom: 0;}
.component-groupbuy .groupbuy-list .row1-of1 .item .img-wrap {width: 100px;height: 100px;}
.component-groupbuy .groupbuy-list .row1-of1 .item .img-wrap > img{width: 100%;}
.component-groupbuy .groupbuy-list .row1-of1 .item .img-wrap .bg{display: none;}
.component-groupbuy .groupbuy-list .row1-of1 .item .content{flex:1;margin-left: 10px;position: relative;}
.component-groupbuy .groupbuy-list .row1-of1 .item .content .goods-name{margin-top: 3px;}
.component-groupbuy .groupbuy-list .row1-of1 .item .content .discount-price{font-weight: bold;font-size: 0;position: absolute;bottom: 3px;left: 0;}
.component-groupbuy .groupbuy-list .row1-of1 .item .content .discount-price .unit{font-size: 12px;}
.component-groupbuy .groupbuy-list .row1-of1 .item .content .discount-price .price{font-size: 16px;}
.component-groupbuy .groupbuy-list .row1-of1 .item .content button{position: absolute;bottom: 3px;right: 10px;padding: 0 8px;height: 26px;font-size: 12px;line-height: 26px;}
/* 样式:横向滑动 */
.component-groupbuy .groupbuy-list .horizontal-slide{display: flex;margin: 10px;overflow: hidden;}
.component-groupbuy .groupbuy-list .horizontal-slide .item {width: 97px;}
.component-groupbuy .groupbuy-list .horizontal-slide .item .img-wrap {width: 97px;height: 97px;overflow: hidden;position: relative;}
.component-groupbuy .groupbuy-list .horizontal-slide .item .img-wrap > img{width: calc(100% + 1px);}
.component-groupbuy .groupbuy-list .horizontal-slide .item .img-wrap .bg {position: absolute;width: 100%;height: 30px;bottom: 0;}
.component-groupbuy .groupbuy-list .horizontal-slide .item .img-wrap .bg img {width: 100%;}
.component-groupbuy .groupbuy-list .horizontal-slide .item .img-wrap .num {width: 90px;position: absolute;bottom: 5px;padding-left: 10px;font-size: 12px;line-height: 1;}
.component-groupbuy .groupbuy-list .horizontal-slide .item .content {padding: 5px 10px;}
.component-groupbuy .groupbuy-list .horizontal-slide .item .content .discount-price{margin-top: 5px;font-weight: bold;}
.component-groupbuy .groupbuy-list .horizontal-slide .item .content .discount-price .unit{font-size: 12px; height: 16px;}
.component-groupbuy .groupbuy-list .horizontal-slide .item .content .discount-price .price{font-size: 16px;}
.component-groupbuy .groupbuy-list .horizontal-slide .item .content .original-price {font-size: 12px;line-height: 1;margin-top: 5px;text-decoration: line-through;}

View File

@ -0,0 +1,290 @@
<nc-component :data="data[index]" class="component-groupbuy">
<!-- 预览 -->
<template slot="preview">
<div class="groupbuy-list" :style="{ backgroundColor: nc.componentBgColor,
borderTopLeftRadius: (nc.componentAngle == 'round' ? nc.topAroundRadius + 'px' : 0),
borderTopRightRadius: (nc.componentAngle == 'round' ? nc.topAroundRadius + 'px' : 0),
borderBottomLeftRadius: (nc.componentAngle == 'round' ? nc.bottomAroundRadius + 'px' : 0),
borderBottomRightRadius: (nc.componentAngle == 'round' ? nc.bottomAroundRadius + 'px' : 0) }">
<div :class="[nc.template,nc.style]">
<template v-if="nc.tempData.previewList && Object.keys(nc.tempData.previewList).length">
<div class="item" v-for="(item, previewIndex) in nc.tempData.previewList" :key="previewIndex"
:style="{
borderTopLeftRadius: (nc.elementAngle == 'round' ? nc.topElementAroundRadius + 'px' : 0),
borderTopRightRadius: (nc.elementAngle == 'round' ? nc.topElementAroundRadius + 'px' : 0),
borderBottomLeftRadius: (nc.elementAngle == 'round' ? nc.bottomElementAroundRadius + 'px' : 0),
borderBottomRightRadius: (nc.elementAngle == 'round' ? nc.bottomElementAroundRadius + 'px' : 0),
backgroundColor: nc.elementBgColor,
marginLeft: nc.template == 'horizontal-slide' && (nc.slideMode == 'scroll' && nc.goodsMarginType=='diy' && (nc.goodsMarginNum+'px') || ((60 - nc.margin.both*2) /6 + 'px')) || '',
marginRight: nc.template == 'horizontal-slide' && (nc.slideMode == 'scroll' && nc.goodsMarginType=='diy' && (nc.goodsMarginNum+'px') || ((60 - nc.margin.both*2) /6 + 'px')) || '',
boxShadow: nc.ornament.type == 'shadow' ? ('0 0 5px ' + nc.ornament.color) : '',
border: nc.ornament.type == 'stroke' ? '1px solid ' + nc.ornament.color : ''}">
<div class="img-wrap" :style="{ borderRadius: nc.imgAroundRadius + 'px' }">
<img :style="{ borderRadius: nc.imgAroundRadius + 'px' }" :src="changeImgUrl('public/static/img/default_img/square.png')" />
<div class="bg" v-if="nc.saleStyle.control"><img src="{$resource_path}/img/bg.png" /></div>
<div class="num" v-if="nc.saleStyle.control" :style="{ color : nc.saleStyle.color }">已团128件</div>
</div>
<div class="content" v-if="nc.goodsNameStyle.control || nc.priceStyle.mainControl || nc.priceStyle.lineControl || nc.btnStyle.control">
<div class="goods-name" v-if="nc.goodsNameStyle.control" :style="{ color : nc.goodsNameStyle.color,fontWeight : nc.goodsNameStyle.fontWeight ? 'bold' : '' }" :class="[{'using-hidden' : nc.nameLineMode == 'single'},{'multi-hidden' : nc.nameLineMode == 'multiple'}]">{{ item.goods_name }}</div>
<div class="discount-price" v-if="nc.priceStyle.mainControl">
<span class="unit" :style="{ color : nc.priceStyle.mainColor }">¥</span>
<span class="price" :style="{ color : nc.priceStyle.mainColor }">{{item.discount_price.split(".")[0]}}</span>
<span class="unit" :style="{ color : nc.priceStyle.mainColor }">{{"."+item.discount_price.split(".")[1]}}</span>
</div>
<div class="original-price" v-if="nc.priceStyle.lineControl" :style="{ color : nc.priceStyle.lineColor }">¥{{item.line_price}}</div>
<button v-if="nc.btnStyle.control" class="layui-btn" :style="{ background : 'linear-gradient(to right,' + nc.btnStyle.bgColorStart + ',' + nc.btnStyle.bgColorEnd + ')', color : nc.btnStyle.textColor,borderRadius : nc.btnStyle.aroundRadius + 'px' }">{{ nc.btnStyle.text }}</button>
</div>
</div>
</template>
</div>
</div>
</template>
<!-- 内容编辑 -->
<template slot="edit-content">
<template v-if="nc.lazyLoad">
<groupbuy-list-sources></groupbuy-list-sources>
<div class="template-edit-title">
<h3>商品风格</h3>
<div class="layui-form-item list-style" v-if="nc.tempData.templateList">
<label class="layui-form-label sm">风格</label>
<div class="layui-input-block">
<div class="source">{{ nc.tempData.templateList[nc.template].text }}</div>
<div class="template-selected">
<div v-for="(item,templateKey) in nc.tempData.templateList" :key="templateKey" class="source-item" :title="item.text"
@click="nc.tempData.methods.selectTemplate(templateKey)"
:class="[(nc.template == templateKey) ? 'text-color border-color' : '' ]">
<i class='iconfont' :class='item.icon'></i>
</div>
</div>
<!-- 暂时只有一种样式,先隐藏 -->
<!-- <div class="style-selected">-->
<!-- <div v-for="(item,styleIndex) in nc.tempData.templateList[nc.template].styleList" :key="styleIndex" @click="nc.tempData.methods.selectTemplate('',item)" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (nc.style==item.value) }">-->
<!-- <i class="layui-anim layui-icon">{{ nc.style == item.value ? "&#xe643;" : "&#xe63f;" }}</i>-->
<!-- <div>{{item.text}}</div>-->
<!-- </div>-->
<!-- </div>-->
</div>
</div>
</div>
<div class="template-edit-title">
<h3>商品数据</h3>
<div class="layui-form-item" v-if="nc.tempData.goodsSources">
<label class="layui-form-label sm">数据来源</label>
<div class="layui-input-block">
<div class="source-selected">
<div class="source">{{ nc.tempData.goodsSources[nc.sources].text }}</div>
<div v-for="(item,sourcesKey) in nc.tempData.goodsSources" :key="sourcesKey" class="source-item" :title="item.text" @click="nc.sources=sourcesKey" :class="{ 'text-color border-color' : (nc.sources == sourcesKey) }">
<i class='iconfont' :class='item.icon'></i>
</div>
</div>
</div>
</div>
<div class="layui-form-item" v-if="nc.sources == 'diy'">
<label class="layui-form-label sm">手动选择</label>
<div class="layui-input-block">
<div class="selected-style" @click="nc.tempData.methods.addGoods()">
<span v-if="nc.goodsId.length == 0">请选择</span>
<span v-if="nc.goodsId.length > 0" class="text-color">已选{{ nc.goodsId.length }}个</span>
<i class="iconfont iconyoujiantou"></i>
</div>
</div>
</div>
<slide :data="{ field : 'count', label: '商品数量', min:1, max: 30}" v-if="nc.sources != 'diy'"></slide>
</div>
<div class="template-edit-title" v-show="nc.btnStyle.support">
<h3>购买按钮</h3>
<div class="layui-form-item">
<label class="layui-form-label sm">是否显示</label>
<div class="layui-input-block">
<div class="layui-unselect layui-form-checkbox" lay-skin="primary" @click="nc.btnStyle.control = !nc.btnStyle.control" :class="{ 'layui-form-checked' : nc.btnStyle.control }">
<span>{{ nc.btnStyle.control ? '显示' : '隐藏' }}</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
</div>
</div>
<div class="layui-form-item" v-if="nc.btnStyle.control">
<label class="layui-form-label sm">文字</label>
<div class="layui-input-block">
<input type="text" v-model="nc.btnStyle.text" maxlength="6" placeholder="请输入按钮文字" class="layui-input">
</div>
</div>
</div>
<div class="template-edit-title">
<h3>显示内容</h3>
<div class="layui-form-item">
<label class="layui-form-label sm">商品名称</label>
<div class="layui-input-block">
<div class="layui-unselect layui-form-checkbox" lay-skin="primary" @click="nc.goodsNameStyle.control = !nc.goodsNameStyle.control" :class="{ 'layui-form-checked' : nc.goodsNameStyle.control }">
<span>{{ nc.goodsNameStyle.control ? '显示' : '隐藏' }}</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label sm">销售价</label>
<div class="layui-input-block">
<div class="layui-unselect layui-form-checkbox" lay-skin="primary" @click="nc.priceStyle.mainControl = !nc.priceStyle.mainControl" :class="{ 'layui-form-checked' : nc.priceStyle.mainControl }">
<span>{{ nc.priceStyle.mainControl ? '显示' : '隐藏' }}</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
</div>
</div>
<div class="layui-form-item" v-show="nc.priceStyle.lineSupport">
<label class="layui-form-label sm">划线价</label>
<div class="layui-input-block">
<div class="layui-unselect layui-form-checkbox" lay-skin="primary" @click="nc.priceStyle.lineControl = !nc.priceStyle.lineControl" :class="{ 'layui-form-checked' : nc.priceStyle.lineControl }">
<span>{{ nc.priceStyle.lineControl ? '显示' : '隐藏' }}</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
</div>
</div>
<div class="layui-form-item" v-show="nc.saleStyle.support">
<label class="layui-form-label sm">商品销量</label>
<div class="layui-input-block">
<div class="layui-unselect layui-form-checkbox" lay-skin="primary" @click="nc.saleStyle.control = !nc.saleStyle.control" :class="{ 'layui-form-checked' : nc.saleStyle.control }">
<span>{{ nc.saleStyle.control ? '显示' : '隐藏' }}</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
</div>
</div>
</div>
</template>
</template>
<!-- 样式编辑 -->
<template slot="edit-style">
<template v-if="nc.lazyLoad">
<div class="template-edit-title">
<h3>商品样式</h3>
<div class="layui-form-item tag-wrap">
<label class="layui-form-label sm">边框</label>
<div class="layui-input-block">
<div v-for="(item,ornamentIndex) in nc.tempData.ornamentList" :key="ornamentIndex" @click="nc.ornament.type=item.type" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (nc.ornament.type==item.type) }">
<i class="layui-anim layui-icon">{{ nc.ornament.type == item.type ? "&#xe643;" : "&#xe63f;" }}</i>
<div>{{item.text}}</div>
</div>
</div>
</div>
<color v-if="nc.ornament.type != 'default'" :data="{ field : 'color', 'label' : '边框颜色', parent : 'ornament', defaultColor : '#EDEDED' }"></color>
<slide :data="{ field : 'imgAroundRadius', label: '图片圆角', min:0, max: 50 }"></slide>
<div class="layui-form-item" v-if="nc.template == 'horizontal-slide'">
<label class="layui-form-label sm">滚动方式</label>
<div class="layui-input-block">
<div @click="nc.slideMode = 'scroll' " :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (nc.slideMode == 'scroll') }">
<i class="layui-anim layui-icon">{{ nc.slideMode == 'scroll' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>平移</div>
</div>
<div @click="nc.slideMode = 'slide' " :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (nc.slideMode == 'slide') }">
<i class="layui-anim layui-icon">{{ nc.slideMode == 'slide' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>切屏</div>
</div>
</div>
</div>
<div class="layui-form-item" v-show="nc.goodsNameStyle.control">
<label class="layui-form-label sm">商品名称</label>
<div class="layui-input-block">
<div class="layui-unselect layui-form-checkbox" lay-skin="primary" @click="nc.goodsNameStyle.fontWeight = !nc.goodsNameStyle.fontWeight" :class="{ 'layui-form-checked' : nc.goodsNameStyle.fontWeight }">
<span>加粗</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
<div v-for="(item,nameLineIndex) in nc.tempData.nameLineModeList" :key="nameLineIndex" @click="nc.nameLineMode=item.value" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (nc.nameLineMode==item.value) }">
<i class="layui-anim layui-icon">{{ nc.nameLineMode == item.value ? "&#xe643;" : "&#xe63f;" }}</i>
<div>{{item.text}}</div>
</div>
</div>
</div>
<color :data="{ field : 'elementBgColor', 'label' : '商品背景' }"></color>
<slide v-show="nc.elementAngle == 'round'" :data="{ field : 'topElementAroundRadius', label : '上圆角', max : 50 }"></slide>
<slide v-show="nc.elementAngle == 'round'" :data="{ field : 'bottomElementAroundRadius', label : '下圆角', max : 50 }"></slide>
<div class="layui-form-item">
<label class="layui-form-label sm">色调</label>
<div class="layui-input-block">
<div @click="nc.theme='default'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (nc.theme == 'default') }">
<i class="layui-anim layui-icon">{{ nc.theme == 'default' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>跟随主题风格</div>
</div>
<div @click="nc.theme='diy'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (nc.theme == 'diy') }">
<i class="layui-anim layui-icon">{{ nc.theme == 'diy' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>自定义</div>
</div>
</div>
</div>
<div v-show="nc.theme == 'diy'">
<color :data="{ field : 'color', 'label' : '商品名称', parent : 'goodsNameStyle', defaultColor : '#303133' }"></color>
<color :data="{ field : 'mainColor', 'label' : '销售价', parent : 'priceStyle', defaultColor : '#FF6A00' }"></color>
<div v-show="nc.priceStyle.lineSupport">
<color :data="{ field : 'lineColor', 'label' : '划线价', parent : 'priceStyle', defaultColor : '#999CA7' }"></color>
</div>
<div v-show="nc.saleStyle.support">
<color :data="{ field : 'color', 'label' : '商品销量', parent : 'saleStyle', defaultColor : '#999CA7' }"></color>
</div>
</div>
</div>
<div class="template-edit-title" v-show="nc.btnStyle.support && nc.btnStyle.control">
<h3>购买按钮</h3>
<slide :data="{ field : 'aroundRadius', label: '圆角', min:0, max: 50, parent: 'btnStyle' }"></slide>
<div class="layui-form-item">
<label class="layui-form-label sm">色调</label>
<div class="layui-input-block">
<div @click="nc.btnStyle.theme='default'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (nc.btnStyle.theme == 'default') }">
<i class="layui-anim layui-icon">{{ nc.btnStyle.theme == 'default' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>跟随主题风格</div>
</div>
<div @click="nc.btnStyle.theme='diy'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (nc.btnStyle.theme == 'diy') }">
<i class="layui-anim layui-icon">{{ nc.btnStyle.theme == 'diy' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>自定义</div>
</div>
</div>
</div>
<template v-if="nc.btnStyle.theme == 'diy'">
<color :data="{ field : 'bgColorStart,bgColorEnd', 'label' : '背景', parent : 'btnStyle', defaultColor : '#FF7B1D,#FF1544' }"></color>
<color :data="{ field : 'textColor', 'label' : '颜色', parent : 'btnStyle', defaultColor : '#FFFFFF' }"></color>
</template>
</div>
</template>
</template>
<!-- 资源 -->
<template slot="resource">
<js>
var groupBuyResourcePath = "{$resource_path}"; // http路径
var groupBuyRelativePath = "{$relative_path}"; // 相对路径
</js>
<css src="{$resource_path}/css/design.css"></css>
<js src="{$resource_path}/js/design.js"></js>
</template>
</nc-component>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View File

@ -0,0 +1,131 @@
var groupbuyListHtml = '<div style="display:none;"></div>';
Vue.component("groupbuy-list-sources", {
template: groupbuyListHtml,
data: function () {
return {
data: this.$parent.data,
goodsSources: {
initial: {
text: "默认",
icon: "iconmofang"
},
diy: {
text: "手动选择",
icon: "iconshoudongxuanze"
},
},
templateList: {
"row1-of1": {
text: "单列",
icon: "iconiPhone86",
styleList: [
{
text: "样式1",
value: "style-1",
cartSupport: true, // 是否支持按钮
saleSupport: false, // 是否支持商品销量
lineSupport: false, // 是否支持划线价
},
],
},
"horizontal-slide": {
text: "横向滑动",
icon: "iconshangpinliebiaohengxianghuadong",
styleList: [
{
text: "样式1",
value: "style-1",
cartSupport: false, // 是否支持按钮
saleSupport: true, // 是否支持商品销量
lineSupport: true, // 是否支持划线价
},
],
},
},
ornamentList: [
{
type: 'default',
text: '默认',
},
{
type: 'shadow',
text: '投影',
},
{
type: 'stroke',
text: '描边',
},
],
nameLineModeList: [
{
text: "单行",
value: "single"
},
{
text: "多行",
value: "multiple"
}
]
}
},
created: function () {
if (!this.$parent.data.verify) this.$parent.data.verify = [];
this.$parent.data.verify.push(this.verify);//加载验证方法
this.$parent.data.ignore = ['textColor']; //加载忽略内容 -- 其他设置中的属性设置
this.$parent.data.ignoreLoad = true; // 等待忽略数组赋值后加载
var previewList = {};
for (var i = 1; i < 4; i++) {
previewList["goods_id_" + ns.gen_non_duplicate(i)] = {
goods_name: "团购商品",
discount_price: (Math.random() * 100 * i + 10).toFixed(2), // 随机价格
line_price: (Math.random() * 100 * i + 100 + 10).toFixed(2), // 随机价格
sale_num: Math.floor((Math.random() * 100 * i + 10 + 10))
};
}
// 组件所需的临时数据
this.$parent.data.tempData = {
goodsSources: this.goodsSources,
templateList: this.templateList,
ornamentList: this.ornamentList,
nameLineModeList: this.nameLineModeList,
previewList: previewList,
methods: {
addGoods: this.addGoods,
selectTemplate: this.selectTemplate
}
};
},
methods: {
verify: function (index) {
var res = {code: true, message: ""};
if (vue.data[index].sources === 'diy' && vue.data[index].goodsId.length === 0) {
res.code = false;
res.message = "请选择商品";
}
return res;
},
addGoods: function () {
var self = this;
goodsSelect(function (res) {
self.$parent.data.goodsId = res;
}, self.$parent.data.goodsId, {mode: "spu", promotion: "groupbuy", disabled: 0, post: ns.appModule});
},
selectTemplate(template, item) {
if (template) {
this.$parent.data.template = template;
item = this.templateList[template].styleList[0];
}
this.$parent.data.style = item.value;
this.$parent.data.btnStyle.support = item.cartSupport;
this.$parent.data.btnStyle.control = item.cartSupport;
this.$parent.data.saleStyle.support = item.saleSupport;
this.$parent.data.saleStyle.control = item.saleSupport;
this.$parent.data.priceStyle.lineSupport = item.lineSupport;
this.$parent.data.priceStyle.lineControl = item.lineSupport;
},
}
});

View File

@ -0,0 +1,75 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
return [
// 自定义模板页面类型,格式:[ 'title' => '页面类型名称', 'name' => '页面标识', 'path' => '页面路径', 'value' => '页面数据json格式' ]
'template' => [],
// 后台自定义组件——装修
'util' => [
// [
// 'name' => 'Activity',
// 'title' => '拓客活动',
// 'type' => 'PROMOTION',
// 'value' => '{"style":"style-1","sources":"initial","count":6,"goodsId":[],"ornament":{"type":"default","color":"#EDEDED"},"nameLineMode":"single","template":"horizontal-slide","goodsMarginType":"default","goodsMarginNum":10,"btnStyle":{"text":"立即团购","textColor":"#FFFFFF","theme":"default","aroundRadius":25,"control":false,"support":false,"bgColorStart":"#FF7B1D","bgColorEnd":"#FF1544"},"imgAroundRadius":5,"slideMode":"scroll","theme":"default","goodsNameStyle":{"color":"#303133","control":true,"fontWeight":false},"priceStyle":{"mainColor":"#FF1745","mainControl":true,"lineColor":"#999CA7","lineControl":true,"lineSupport":true},"saleStyle":{"color":"#FFFFFF","control":true,"support":true},"titleStyle":{"isShow":true,"leftStyle":"text","leftImg":"","style":"style-1","styleName":"风格1","leftText":"限时秒杀","fontSize":16,"fontWeight":true,"textColor":"#303133","bgColorStart":"#FFFFFF","bgColorEnd":"#FFFFFF","more":"查看更多","moreColor":"#999999","moreFontSize":12}}',
// 'sort' => '30005',
// 'support_diy_view' => '',
// 'max_count' => 0,
// 'icon' => 'iconfont icontuangou1',
// ]
],
// 自定义页面路径
'link' => [
// [
// 'name' => 'Activity',
// 'title' => '拓客活动',
// 'parent' => 'MARKETING_LINK',
// 'wap_url' => '',
// 'web_url' => '',
// 'sort' => 0,
// 'child_list' => [
// [
// 'name' => 'ACTIVITY_PREFECTURE',
// 'title' => '活动专区',
// 'wap_url' => '/pages_promotion/activity/list',
// 'web_url' => '',
// 'sort' => 0
// ]
// ]
// ],
// [
// 'name' => 'ACTIVITY_GOODS',
// 'title' => '活动商品',
// 'parent' => 'COMMODITY',
// 'wap_url' => '',
// 'web_url' => '',
// 'child_list' => []
// ]
],
// 自定义图标库
'icon_library' => [],
// uni-app 组件,格式:[ 'name' => '组件名称/文件夹名称', 'path' => '文件路径/目录路径' ]多个逗号隔开自定义组件名称前缀必须是diy-,也可以引用第三方组件
'component' => [],
// uni-app 页面,多个逗号隔开
'pages' => [],
// 模板信息,格式:'title' => '模板名称', 'name' => '模板标识', 'cover' => '模板封面图', 'preview' => '模板预览图', 'desc' => '模板描述'
'info' => [],
// 主题风格配色格式可以自由定义扩展【在uni-app中通过this.themeStyle... 获取定义的颜色字段例如this.themeStyle.main_color】
'theme' => [],
// 自定义页面数据,格式:[ 'title' => '页面名称', 'name' => "页面标识", 'value' => [页面数据json格式] ]
'data' => []
];

View File

@ -0,0 +1,26 @@
<?php
// 事件定义文件
return [
'bind' => [
],
'listen' => [
//开启拓客
'OpenActivity' => [
'addon\activity\event\OpenActivity',
],
//关闭拓客
'CloseActivity' => [
'addon\activity\event\CloseActivity',
],
//展示活动
'ShowPromotion' => [
'addon\activity\event\ShowPromotion',
],
],
'subscribe' => [
],
];

View File

@ -0,0 +1,20 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
return [
'name' => 'activity',
'title' => '拓客活动',
'description' => '拓客管理活动',
'type' => 'promotion', //插件类型 system :系统插件(自动安装), promotion:扩展营销插件 tool:工具插件
'status' => 1,
'author' => '',
'version' => '1.0.0',
'version_no' => '520230316001',
'content' => '',
];

View File

@ -0,0 +1,57 @@
<?php
// +----------------------------------------------------------------------
// | 店铺端菜单设置
// +----------------------------------------------------------------------
return [
[
'name' => 'PROMOTION_ACTIVITY',
'title' => '拓客活动',
'url' => 'activity://shop/activity/lists',
'parent' => 'PROMOTION_CENTER',
'is_show' => 1,
'sort' => 100,
'child_list' => [
[
'name' => 'PROMOTION_ACTIVITY_LIST',
'title' => '活动列表',
'url' => 'activity://shop/activity/lists',
'parent' => 'PROMOTION_ACTIVITY',
'is_show' => 1,
'child_list' => [
[
'name' => 'PROMOTION_ACTIVITY_ADD',
'title' => '添加活动',
'url' => 'activity://shop/activity/add',
'sort' => 1,
'is_show' => 0
],
[
'name' => 'PROMOTION_ACTIVITY_EDIT',
'title' => '编辑活动',
'url' => 'activity://shop/activity/edit',
'sort' => 1,
'is_show' => 0
],
[
'name' => 'PROMOTION_ACTIVITY_DELETE',
'title' => '删除活动',
'url' => 'activity://shop/activity/delete',
'sort' => 1,
'is_show' => 0
],
[
'name' => 'PROMOTION_ACTIVITY_FINISH',
'title' => '结束活动',
'url' => 'activity://shop/activity/finish',
'sort' => 1,
'is_show' => 0
]
]
],
]
],
];

View File

@ -0,0 +1 @@
SET NAMES 'utf8';

View File

@ -0,0 +1 @@
SET NAMES 'utf8';

View File

@ -0,0 +1,28 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\activity\event;
use addon\activity\model\ActivityModel;
/**
* 关闭活动
*/
class CloseActivity
{
public function handle($params)
{
$model = new ActivityModel();
$res = $model->cronCloseActivity($params['relate_id']);
return $res;
}
}

View File

@ -0,0 +1,25 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\activity\event;
/**
* 应用安装
*/
class Install
{
/**
* 执行安装
*/
public function handle()
{
return success();
}
}

View File

@ -0,0 +1,28 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\activity\event;
use addon\activity\model\ActivityModel;
/**
* 启动活动
*/
class OpenActivity
{
public function handle($params)
{
$model = new ActivityModel();
$res = $model->cronOpenActivity($params['relate_id']);
return $res;
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace addon\activity\event;
class ShowPromotion
{
public function handle()
{
$data = [
'shop' => [
[
//插件名称
'name' => 'activity',
//展示分类根据平台端设置admin平台营销shop店铺营销member:会员营销, tool:应用工具)
'show_type' => 'shop',
//展示主题
'title' => '拓客活动',
//展示介绍
'description' => '供应链拓客活动,平台拓客,无需备货',
//展示图标
'icon' => 'addon/activity/icon.png',
//跳转链接
'url' => 'activity://shop/activity/lists',
]
]
];
return $data;
}
}

View File

@ -0,0 +1,25 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\activity\event;
/**
* 应用卸载
*/
class UnInstall
{
/**
* 执行卸载
*/
public function handle()
{
return success();
}
}

BIN
addon/activity/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,247 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\activity\model;
use app\model\BaseModel;
use app\model\goods\Goods;
use app\model\system\Config as ConfigModel;
use app\model\system\Cron;
use think\facade\Cache;
use think\facade\Db;
/**
* 团购活动
*/
class ActivityModel extends BaseModel
{
/**
* Common: 添加拓客活动
* Author: ldy
* Time: 2024/08/22 11:59
* Interface addActivity
* @package addon\activity\model
*/
public function addActivity($data){
$time = time();
if($data['start_time'] < $time && $data['end_time'] > $time){
$data['status'] = 1;
}else if($data['start_time'] < $time){
$data['status'] = 0;
}else if($data['end_time'] > time()){
$data['status'] = 2;
}
model('promotion_activity')->startTrans();
try{
$activity_id = model('promotion_activity')->add($data);
if($activity_id){
$cron = new Cron();
if($data['status'] === 0){
$cron->addCron(1, 0, "拓客活动开启", "OpenActivity", $data[ 'start_time' ], $activity_id);
$cron->addCron(1, 0, "拓客活动关闭", "CloseActivity", $data[ 'end_time' ], $activity_id);
}else{
$cron->addCron(1, 0, "拓客活动关闭", "CloseActivity", $data[ 'end_time' ], $activity_id);
}
}
model('promotion_activity')->commit();
return $this->success();
}catch(\Exception $e){
model('promotion_activity')->rollback();
return $this->error();
}
}
/**
* Common: 添加拓客活动
* Author: ldy
* Time: 2024/08/22 15:24
* Interface addActivity
* @package addon\activity\model
*/
public function editActivity($activity_id,$data,$site_id){
$time = time();
if($data['start_time'] < $time && $data['end_time'] > $time){
$data['status'] = 1;
}else if($data['start_time'] < $time){
$data['status'] = 0;
}else if($data['end_time'] > time()){
$data['status'] = 2;
}
model('promotion_activity')->startTrans();
try{
$res = model('promotion_activity')->update($data,[ [ 'activity_id', '=', $activity_id ], [ 'site_id', '=', $site_id ] ]);
if($activity_id){
$cron = new Cron();
if($data['status'] === 0){
$cron->deleteCron([ [ 'event', '=', 'OpenActivity' ], [ 'relate_id', '=', $activity_id ] ]);
$cron->deleteCron([ [ 'event', '=', 'CloseActivity' ], [ 'relate_id', '=', $activity_id ] ]);
$cron->addCron(1, 0, "拓客活动开启", "OpenActivity", $data[ 'start_time' ], $activity_id);
$cron->addCron(1, 0, "拓客活动关闭", "CloseActivity", $data[ 'end_time' ], $activity_id);
}else{
$cron->deleteCron([ [ 'event', '=', 'OpenActivity' ], [ 'relate_id', '=', $activity_id ] ]);
$cron->deleteCron([ [ 'event', '=', 'CloseActivity' ], [ 'relate_id', '=', $activity_id ] ]);
$cron->addCron(1, 0, "拓客活动关闭", "CloseActivity", $data[ 'end_time' ], $activity_id);
}
}
model('promotion_activity')->commit();
return $this->success($res);
}catch(\Exception $e){
model('promotion_activity')->rollback();
return $this->error();
}
}
/**
* Common: 关闭拓客活动
* Author: ldy
* Time: 2024/08/22 14:03
* Interface cronCloseActivity
* @package addon\activity\model
*/
public function getActivityPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '')
{
$field = '*';
$list = model('promotion_activity')->pageList($condition, $field, $order, $page, $page_size);
if($list && count($list['list'])){
foreach($list['list'] as $key => &$value){
$value['goods'] = self::getActivityGoods(json_decode($value['goods_ids']));
$value['form_title'] = $value['form_id'] > 0 ? model('form')->getValue(['id' => $value['form_id']],'form_name') : '暂无';
$value['poster_title'] = $value['template_id'] > 0 ? model('poster_template')->getValue(['template_id' => $value['template_id']],'poster_name') : '暂无';
}
}
return $this->success($list);
}
public function getActivityInfo($condition = [], $field = '*'){
$info = model("promotion_activity")->getInfo($condition, $field);
if($info){
$goods_ids = json_decode($info['goods_ids'],true);
$info['goods_ids'] = $goods_ids;
$info['activity_image'] = implode(',',json_decode($info['activity_image'],true));
$goods = self::getActivityGoods($goods_ids);
$info['goods'] = $goods;
$info['goods_num'] = count($goods);
$divide_money_ids = json_decode($info['divide_money_ids'],true);//分账账号
$info['divide_money_ids'] = $divide_money_ids;
$info['divide_ids'] = implode(',',$divide_money_ids);
}
return $this->success($info);
}
/**
* 删除拓客活动
* @param $groupbuy_id
* @param $site_id
* @return array|\multitype
*/
public function deleteActivity($activity_id, $site_id)
{
//团购信息
$info = model('promotion_activity')->getInfo([ [ 'activity_id', '=', $activity_id ], [ 'site_id', '=', $site_id ] ], 'activity_id,status');
if ($info) {
if ($info['status'] == 1) {
$res = model('promotion_activity')->delete([ [ 'activity_id', '=', $activity_id ] ]);
if ($res) {
$cron = new Cron();
$cron->deleteCron([ [ 'event', '=', 'OpenActivity' ], [ 'relate_id', '=', $activity_id ] ]);
$cron->deleteCron([ [ 'event', '=', 'CloseActivity' ], [ 'relate_id', '=', $activity_id ] ]);
}
return $this->success($res);
} else {
return $this->error('', '拓客活动进行中');
}
} else {
return $this->error('', '拓客活动不存在');
}
}
public function urlQrcode($page, $qrcode_param, $promotion_type, $site_id)
{
$params = [
'site_id' => $site_id,
'data' => $qrcode_param,
'page' => $page,
'promotion_type' => $promotion_type,
'h5_path' => $page . '?id=' . $qrcode_param[ 'id' ],
'qrcode_path' => 'upload/qrcode/activity',
'qrcode_name' => [
'h5_name' => 'activity_qrcode_' . $promotion_type . '_h5_' . $qrcode_param[ 'id' ] . '_' . $site_id,
'weapp_name' => 'activity_qrcode_' . $promotion_type . '_weapp_' . $qrcode_param[ 'id' ] . '_' . $site_id
]
];
$solitaire = event('ExtensionInformation', $params);
return $this->success($solitaire[ 0 ]);
}
/**
* Common: 关闭拓客活动
* Author: ldy
* Time: 2024/08/23 11:08
* Interface cronCloseActivity
* @package addon\activity\model
*/
public function cronCloseActivity($activity_id){
return model('promotion_activity')->update(['status' => 2],[ [ 'activity_id', '=', $activity_id ]]);
}
/**
* Common: 开启拓客活动
* Author: ldy
* Time: 2024/08/23 11:02
* Interface cronOpenActivity
* @package addon\activity\model
*/
public function cronOpenActivity($activity_id){
return model('promotion_activity')->update(['status' => 1],[ [ 'activity_id', '=', $activity_id ]]);
}
protected function getActivityGoods($goods_ids){
$model = new Goods();
$goods = $model->getGoodsSelect([ [ 'goods_id', 'in', $goods_ids ] ], 'goods_name,goods_image,price,goods_stock,goods_service_ids');
return $goods['data'];
}
/**
* 获取活动商品详情
* @param $condition
* @param string $field
* @return array
*/
public function getActivityGoodsDetail($condition, $field = '')
{
if (empty($field)) {
$field = 'sku.goods_id,sku.sku_id,sku.sku_name,sku.sku_spec_format,sku.price,sku.promotion_type,sku.stock,sku.click_num,(g.sale_num + g.virtual_sale) as sale_num,sku.collect_num,sku.sku_image,sku.sku_images,sku.site_id,sku.goods_content,sku.goods_state,sku.is_virtual,sku.is_free_shipping,sku.goods_spec_format,sku.goods_attr_format,sku.introduction,sku.support_trade_type,sku.unit,sku.video_url,sku.evaluate,sku.goods_service_ids,ptg.id,ptg.topic_id,ptg.start_time,ptg.end_time,ptg.topic_price,pt.topic_name,g.goods_image,g.goods_stock,g.goods_name,sku.qr_id,sku.market_price,g.stock_show,g.sale_show,g.market_price_show,g.barrage_show,g.label_name,pt.remark';
}
$alias = 'ptg';
$join = [
[ 'goods_sku sku', 'ptg.sku_id = sku.sku_id', 'inner' ],
[ 'goods g', 'g.goods_id = sku.goods_id', 'inner' ],
// [ 'promotion_topic pt', 'pt.topic_id = ptg.topic_id', 'inner' ],
];
$info = model('promotion_activity')->getInfo($condition, $field, $alias, $join);
if (!empty($info)) {
if (isset($info[ 'sale_num' ])) {
$info[ 'sale_num' ] = numberFormat($info[ 'sale_num' ]);
}
if (isset($info[ 'stock' ])) {
$info[ 'stock' ] = numberFormat($info[ 'stock' ]);
}
if (isset($info[ 'goods_stock' ])) {
$info[ 'goods_stock' ] = numberFormat($info[ 'goods_stock' ]);
}
}
return $this->success($info);
}
}

View File

@ -0,0 +1,216 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\activity\shop\controller;
use addon\activity\model\ActivityModel;
use addon\dividemoney\model\DividemoneyAccount;
use addon\form\model\Form;
use addon\postertemplate\model\PosterTemplate as PosterTemplateModel;
use app\model\system\Site;
use app\shop\controller\BaseShop;
/**
* 团购控制器
*/
class Activity extends BaseShop
{
/*
* 团购活动列表
*/
public function lists()
{
$model = new ActivityModel();
//获取续签信息
if (request()->isAjax()) {
$condition = [
[ 'site_id', '=', $this->site_id ],
[ 'is_del', '=', 1 ]
];
$status = input('status', '');//团购状态
if ($status !== '') {
$condition[] = [ 'status', '=', $status ];
}
$start_time = input('start_time', '');
$end_time = input('end_time', '');
if ($start_time && !$end_time) {
$condition[] = [ 'end_time', '>=', date_to_time($start_time) ];
} elseif (!$start_time && $end_time) {
$condition[] = [ 'start_time', '<=', date_to_time($end_time) ];
} elseif ($start_time && $end_time) {
$start_timestamp = date_to_time($start_time);
$end_timestamp = date_to_time($end_time);
$sql = "start_time between {$start_timestamp} and {$end_timestamp}";
$sql .= " or end_time between {$start_timestamp} and {$end_timestamp}";
$sql .= " or (start_time <= {$start_timestamp} and end_time >= {$end_timestamp})";
$condition[] = [ '', 'exp', \think\facade\Db::raw($sql) ];
}
//排序
$order = input('order', 'create_time');
$sort = input('sort', 'desc');
if ($order == 'create_time') {
$order_by = $order . ' ' . $sort;
} else {
$order_by = $order . ' ' . $sort . ',create_time desc';
}
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$list = $model->getActivityPageList($condition, $page, $page_size, $order_by);
return $list;
} else {
return $this->fetch("activity/lists");
}
}
/**
* 添加活动
*/
public function add()
{
if (request()->isAjax()) {
//获取商品信息
$data = [
'site_id' => $this->site_id,
'activity_image' => json_encode(input('activity_image','')),
'activity_price' => input('activity_price',0),
'remark' => input('remark',''),
'content' => input('content',''),
'audio_url' => input('audio_url',''),
'goods_ids' => json_encode(input('goods_ids','')),
'start_time' => strtotime(input('start_time', '')),
'end_time' => strtotime(input('end_time', '')),
'template_id' => input('template_id',0),
'form_id' => input('form_id',0),
'payee_name' => input('payee_name',''),
'payee_account' => input('payee_account',''),
'divide_money_ids' => json_encode(input('divide_money_ids','')),
'virtual_sale' => input('virtual_sale',0),
'buy_agreement' => input('buy_agreement',''),
'is_recycle_integral' => input('is_recycle_integral',0),
'create_time' => time(),
'status' => 0
];
$model = new ActivityModel();
return $model->addActivity($data);
} else {
//获取海报
$poster_template_model = new PosterTemplateModel();
$poster_list = $poster_template_model->getPosterTemplateList([['site_id', '=', $this->site_id], ['template_status', '=', 1]], 'template_id,poster_name,site_id');
$this->assign('poster_list', $poster_list['data']);
// $this->assign('virtualcard_exit', addon_is_exit('virtualcard', $this->site_id));
$form_is_exit = addon_is_exit('form', $this->site_id);
if ($form_is_exit) {
$form_list = (new Form())->getFormList([['site_id', '=', $this->site_id], ['form_type', '=', 'custom'], ['is_use', '=', 1]], 'id desc', 'id, form_name')['data'];
$this->assign('form_list', $form_list);
}
$this->assign('form_is_exit', $form_is_exit);
$divide_money_is_exit = addon_is_exit('dividemoney', $this->site_id);
$this->assign('divide_money_is_exit', $divide_money_is_exit);
return $this->fetch("activity/add");
}
}
/**
* 编辑活动
*/
public function edit()
{
$activity_id = input('activity_id', '');
$model = new ActivityModel();
if (request()->isAjax()) {
//获取商品信息
$data = [
'site_id' => $this->site_id,
'activity_image' => json_encode(input('activity_image','')),
'activity_price' => input('activity_price',0),
'remark' => input('remark',''),
'content' => input('content',''),
'audio_url' => input('audio_url',''),
'goods_ids' => json_encode(input('goods_ids','')),
'start_time' => strtotime(input('start_time', '')),
'end_time' => strtotime(input('end_time', '')),
'template_id' => input('template_id',0),
'form_id' => input('form_id',0),
'payee_name' => input('payee_name',''),
'payee_account' => input('payee_account',''),
'divide_money_ids' => json_encode(input('divide_money_ids','')),
'virtual_sale' => input('virtual_sale',0),
'buy_agreement' => input('buy_agreement',''),
'is_recycle_integral' => input('is_recycle_integral',0),
'update_time' => time(),
];
return $model->editActivity($activity_id, $data, $this->site_id);
} else {
//获取海报
$poster_template_model = new PosterTemplateModel();
$poster_list = $poster_template_model->getPosterTemplateList([['site_id', '=', $this->site_id], ['template_status', '=', 1]], 'template_id,poster_name,site_id');
$this->assign('poster_list', $poster_list['data']);
$form_is_exit = addon_is_exit('form', $this->site_id);
if ($form_is_exit) {
$form_list = (new Form())->getFormList([['site_id', '=', $this->site_id], ['form_type', '=', 'goods'], ['is_use', '=', 1]], 'id desc', 'id, form_name')['data'];
$this->assign('form_list', $form_list);
}else{
$this->assign('form_list', []);
}
$this->assign('form_is_exit', $form_is_exit);
$divide_money_is_exit = addon_is_exit('dividemoney', $this->site_id);
$this->assign('divide_money_is_exit', $divide_money_is_exit);
//获取团购信息
$condition = [
[ 'activity_id', '=', $activity_id ],
[ 'site_id', '=', $this->site_id ],
[ 'is_del', '=', 1 ]
];
$info = $model->getActivityInfo($condition)[ 'data' ];
if (empty($info)) $this->error('未获取到活动数据', addon_url('activity://shop/activity/lists'));
$divide_list = [];
if(count($info['divide_money_ids']) > 0 && $divide_money_is_exit){
$divide_list = (new DividemoneyAccount())->getDivideList([['site_id','=', $this->site_id],['id', 'in', $info['divide_money_ids']]],'id,account,realname');
}
$this->assign('divide_list', $divide_list);
$this->assign('info', $info);
return $this->fetch("activity/edit");
}
}
/*
* 删除团购活动
*/
public function delete()
{
$activity_id = input('activity_id', '');
$groupbuy_model = new ActivityModel();
return $groupbuy_model->deleteActivity($activity_id, $this->site_id);
}
/**
* 团购推广
*/
public function activityUrl()
{
$activity_id = input('activity_id', '');
$model = new ActivityModel();
$res = $model->urlQrcode('/pages_promotion/activity/detail', [ 'id' => $activity_id ], 'activity', $this->site_id);
return $res;
}
}

View File

@ -0,0 +1,644 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style>
.layui-form-item .layui-input-inline.end-time{float: none;}
.layui-table-body{max-height: 480px !important;}
.goods-title{display: flex;align-items: center;}
.goods-title .goods-img{display: flex;align-items: center;justify-content: center;width: 55px;height: 55px;margin-right: 5px;}
.goods-title .goods-img img{max-height: 100%;max-width: 100%;}
.goods-title .goods-name{flex: 1;line-height: 1.6;}
.form-wrap {position: relative;}
.goods_num {padding-left: 20px;}
</style>
{/block}
{block name="main"}
<div class="layui-form form-wrap">
<div class="layui-form-item" >
<label class="layui-form-label"><span class="required">*</span>活动时间:</label>
<div class="layui-inline">
<div class="layui-input-inline">
<input type="text" id="start_time" name="start_time" lay-verify="required" class="layui-input len-mid" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<span class="layui-form-mid">-</span>
<div class="layui-input-inline end-time">
<input type="text" id="end_time" name="end_time" lay-verify="required|time" class="layui-input len-mid" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>活动banner</label>
<div class="layui-input-block">
<div class="js-store-image"></div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>活动价格:</label>
<div class="layui-input-block">
<input type="text" name="activity_price" placeholder="请输入活动价格" lay-verify="required|number" autocomplete="off" class="layui-input len-short">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">活动内容:</label>
<div class="layui-input-block">
<textarea class="layui-textarea len-long" name="remark" maxlength="300"></textarea>
</div>
</div>
<!-- <div class="layui-form-item">-->
<!-- <label class="layui-form-label">音频路径</label>-->
<!-- <div class="layui-input-block">-->
<!-- <input type="text" name="audio_url" placeholder="在此输入外链音频频地址" autocomplete="off" class="layui-input len-long">-->
<!-- </div>-->
<!-- <div class="file-title word-aux">-->
<!-- <div>注意事项:</div>-->
<!-- <ul>-->
<!-- <li>2、必须上传.mp3格式</li>-->
<!-- </ul>-->
<!-- </div>-->
<!-- </div>-->
<div class="layui-form-item">
<label class="layui-form-label">分享海报:</label>
<div class="layui-input-block len-mid">
<select name="template_id" lay-search lay-verify="">
<option value="0">请选择活动分享海报</option>
{foreach name="$poster_list" item="vo"}
<option value="{$vo['template_id']}">{$vo['poster_name']}</option>
{/foreach}
</select>
</div>
</div>
{if $form_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">活动表单:</label>
<div class="layui-input-block len-mid">
<select name="form_id">
<option value="0">请选择活动表单</option>
{foreach name="$form_list" item="vo"}
<option value="{$vo.id}">{$vo.form_name}</option>
{/foreach}
</select>
</div>
</div>
{/if}
<div class="layui-form-item">
<label class="layui-form-label">独立收款:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="checkbox" name="is_activity_pay" value="1" lay-filter="third_party" lay-skin="switch">
</div>
</div>
<div class="word-aux">开启活动收款功能,可单独设置活动收款账号,不设置则使用店铺默认收款账号。</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">收款方名称</label>
<div class="layui-input-block">
<input type="text" name="payee_name" autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">收款方账号</label>
<div class="layui-input-block">
<input type="text" name="payee_account" autocomplete="off" class="layui-input len-long">
</div>
<div class="word-aux">独立收款,目前仅支持畅捷支付收款</div>
</div>
{if $divide_money_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">收益分账:</label>
<div class="layui-input-block">
<div class="divide-item coupon">
<div class="discount-cont">
<div><a href="javascript:;" class="text-color select-divide">选择账号</a></div>
<div>
<table class="layui-table" lay-skin="nob">
<colgroup>
<col width="5%">
<col width="30%">
<col width="30%">
<col width="20%">
</colgroup>
<thead>
<tr>
<th>账号ID</th>
<th>企业名称</th>
<th>账号</th>
<th style="text-align:center;">操作</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
</div>
{/if}
<div class="layui-form-item goods_list">
<label class="layui-form-label">活动商品:</label>
<div class="layui-input-block">
<table id="selected_goods_list" lay-filter="selected_goods_list"></table>
<button class="layui-btn" onclick="addGoods()">选择商品</button>
<span class="goods_num">已选商品(<span id="goods_num" class="text-color">0</span></span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">活动详情:</label>
<div class="layui-input-block special-length">
<script id="container" name="content" type="text/plain" style="width:100%;height:500px;"></script>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">购买协议:</label>
<div class="layui-input-block special-length">
<script id="buyAgreement" name="buy_agreement" type="text/plain" style="width:100%;height:500px;"></script>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟销量</label>
<div class="layui-input-block">
<input type="number" name="virtual_sale" value="0" autocomplete="off" class="layui-input len-mid">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否参与循环消费:</label>
<div class="layui-input-block">
<input type="radio" name="is_recycle_integral" value="1" title="是" checked>
<input type="radio" name="is_recycle_integral" value="0" title="否" >
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
<input type="hidden" name="goods_ids" value="" />
</div>
{/block}
{block name="script"}
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script src="__STATIC__/ext/drag-arrange.js"></script>
<script type="text/html" id="storeImageTpl">
{{# if(d.list.length){ }}
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="item upload_img_square_item" data-index="{{i}}">
<div class="img-wrap">
<img src="{{ns.img(d.list[i],'small')}}" layer-src>
</div>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
<div class="replace_img" data-index="{{i}}">点击替换</div>
</div>
</div>
{{# } }}
{{# if(d.list.length < d.max){ }}
<div class="item js-add-image upload_img_square">+</div>
{{# } }}
{{# }else{ }}
<div class="item js-add-image upload_img_square">+</div>
{{# } }}
</script>
<script type="text/html" id="couponList">
<div class="gift-box">
<div class="single-filter-box">
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="coupon_name" placeholder="请输入账号" class="layui-input len-mid">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="coupon-search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<table id="coupon_list" lay-filter="coupon_list"></table>
</div>
</script>
<script type="text/html" id="couponOperation">
{{# var select_coupon_list = ','+coupon_list+','}}
{{# if(select_coupon_list.indexOf(','+d.id+',') != -1){ }}
<p title="该账号已参加">已添加</p>
{{# }else{ }}
<a class="layui-btn" lay-event="add">添加</a>
{{# } }}
</script>
<script>
var ue = UE.getEditor('container');
var ues = UE.getEditor('buyAgreement');
var goodsId = [], selectedGoodsId = [], goods_list = [];
var upload,laytpl,storeImage = [];
var coupon_list = '';
const STORE_IMAGE_MAX = 5;
layui.use(['form', 'laydate','carousel','laytpl'], function() {
var form = layui.form,
laydate = layui.laydate,
carousel = layui.carousel,
repeat_flag = false,
currentDate = new Date(),
minDate = "";
laytpl = layui.laytpl;
currentDate.setDate(currentDate.getDate() + 30);
carousel.render({
elem: '#carousel',
width: '100%',
arrow: 'always',
interval: 3500
});
form.render();
renderTable(goods_list); // 初始化表格
//开始时间
laydate.render({
elem: '#start_time', //指定元素
type: 'datetime',
value: new Date(),
done: function(value) {
minDate = value;
reRender();
}
});
//结束时间
laydate.render({
elem: '#end_time', //指定元素
type: 'datetime',
value: new Date(currentDate)
});
/**
* 重新渲染结束时间
* */
function reRender() {
$("#end_time").remove();
$(".end-time").html('<input type="text" id="end_time" name="end_time" placeholder="请输入结束时间" lay-verify="required|time" class="layui-input len-mid" autocomplete="off" readonly> ');
laydate.render({
elem: '#end_time',
type: 'datetime',
min: minDate
});
}
upload = new Upload({
elem: '#storeUpload',
auto:false,
bindAction:'#storeImage',
// callback: function(res) {
// uploadComplete('store_image', res.data.pic_path);
// }
});
/**
* 表单验证
*/
form.verify({
time: function(value) {
var now_time = (new Date()).getTime();
var start_time = (new Date($("#start_time").val())).getTime();
var end_time = (new Date(value)).getTime();
if (now_time > end_time) {
return '结束时间不能小于当前时间!'
}
if (start_time > end_time) {
return '结束时间不能小于开始时间!';
}
},
});
/**
* 表单提交
*/
form.on('submit(save)', function(data){
if (!goodsId.length) {
layer.msg("请选择活动商品!", {icon: 5, anim: 6});
return;
}
data.field.goods_ids = goodsId;
ue.ready(function() { //对编辑器的操作最好在编辑器ready之后再做
html = ue.getContent(); //获取html内容返回: <p>hello</p>
});
ues.ready(function() { //对编辑器的操作最好在编辑器ready之后再做
htmls = ues.getContent(); //获取html内容返回: <p>hello</p>
});
data.field.content = html;
data.field.buy_agreement = htmls;
data.field.activity_image = storeImage;
var divide_money_ids = coupon_list.split(',');
data.field.divide_money_ids = divide_money_ids;
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("activity://shop/activity/add"),
data: data.field,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('添加成功', {
title:'操作提示',
btn: ['返回列表', '继续添加'],
closeBtn: 0,
yes: function(){
location.href = ns.url("activity://shop/activity/lists");
},
btn2: function() {
location.href = ns.url("activity://shop/activity/add");
}
});
}else{
layer.msg(res.message);
}
}
})
});
// 添加门店图片
$("body").on("click", ".js-add-image", function () {
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (storeImage.length < STORE_IMAGE_MAX) storeImage.push(data[i].pic_path);
}
refreshStoreImage();
}, 5, 1);
});
function refreshStoreImage() {
var store_image_template = $("#storeImageTpl").html();
var data = {
list: storeImage,
max: STORE_IMAGE_MAX
};
laytpl(store_image_template).render(data, function (html) {
$(".js-store-image").html(html);
//加载图片放大
loadImgMagnify();
if (storeImage.length) {
//预览
$(".js-store-image .js-preview").click(function () {
$(this).parent().prev().find("img").click();
});
//图片删除
$(".js-store-image .js-delete").click(function () {
var index = $(this).attr("data-index");
storeImage.splice(index, 1);
refreshStoreImage();
});
// // 拖拽
$('.js-store-image .upload_img_square_item').arrangeable({
//拖拽结束后执行回调
callback: function (e) {
var indexBefore = $(e).attr("data-index");//拖拽前的原始位置
var indexAfter = $(e).index();//拖拽后的位置
var temp = storeImage[indexBefore];
storeImage[indexBefore] = storeImage[indexAfter];
storeImage[indexAfter] = temp;
refreshStoreImage();
}
});
}
//最多传十张图
if (storeImage.length < STORE_IMAGE_MAX) {
$(".js-add-image").show();
} else {
$(".js-add-image").hide();
}
});
}
refreshStoreImage();
});
// 表格渲染
function renderTable(goods_list) {
//展示已知数据
table = new Table({
elem: '#selected_goods_list',
page: false,
limit: Number.MAX_VALUE,
cols: [
[{
title: '商品名称',
width: '26%',
unresize: 'false',
templet: function(data) {
var html = '';
html += `
<div class="goods-title">
<div class="goods-img">
<img layer-src src="${data.goods_image ? ns.img(data.goods_image.split(",")[0],'small') : ''}" alt="">
</div>
<p class="multi-line-hiding goods-name" data-goods_id="${data.goods_id}" title="${data.goods_name}">${data.goods_name}</p>
</div>
`;
return html;
}
}, {
field: 'price',
title: '商品价格',
unresize: 'false',
align: 'right',
width: '15%',
templet: function(data) {
return '<p class="line-hiding" title="'+ data.price +'"><span class="goods-price">' + data.price +'</span></p>';
}
}, {
field: 'goods_stock',
title: '库存',
unresize: 'false',
width: '10%',
templet: function(data) {
return '<p class="stock">' + data.goods_stock +'</p>';
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
],
data: goods_list,
toolbar: '#toolbarOperation'
});
/**
* 批量操作
*/
table.toolbar(function(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "group-price":
editInput(0,obj);
break;
case "purchase-num":
editInput(1,obj);
break;
}
});
}
/**
* 添加商品
*/
function addGoods(){
goodsSelect(function(res) {
if (!res.length) return false;
goodsId = [];
goods_list = [];
for(var i=0;i<res.length;i++) {
goodsId.push(res[i].goods_id);
res[i].buy_num = 2;
goods_list.push(res[i]);
}
renderTable(goods_list);
$("input[name='goods_ids']").val(JSON.stringify(goodsId));
$("#goods_num").html(goodsId.length);
selectedGoodsId = goodsId.toString();
}, selectedGoodsId);
goods_list.splice(0,goods_list.length);
}
function delRow(obj,id) {
for (var i = 0; i < goods_list.length; i++){
if (goods_list[i].goods_id == parseInt(id)){
goods_list.splice(i,1);
}
}
if(goodsId.indexOf(id) != -1) goodsId.splice(goodsId.indexOf(id),1);
$("#goods_num").html(goodsId.length);
selectedGoodsId = goodsId.toString();
$(obj).parents("tr").remove();
}
function back() {
location.href = ns.url("activity://shop/activity/lists");
}
$('body').on('click', '.divide-item .select-divide', function(e){
var event = this;
layer.open({
type: 1,
area: ["1200px","600px"],
title: '账号列表',
skin: 'select-coupon-layer',
content: $("#couponList").html()
});
couponTable = new Table({
elem: "#coupon_list",
url: ns.url("dividemoney://shop/account/list"),
where: {'status': 1},
cols: [
[{
title: '企业名称',
unresize: 'false',
width: '30%',
field: 'realname',
}, {
title: '账号',
unresize: 'false',
width: '30%',
field: 'account',
},{
field: 'divide_rate',
title: '分佣比例(%)',
unresize: 'false',
width: '20%',
templet: function(data){
return data.divide_rate + '%';
}
}, {
title: '操作',
toolbar: '#couponOperation',
unresize: 'false',
align:'right'
}]
]
});
couponTable.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case "add":
addcoupon(data);
break;
}
});
function addcoupon(data){
var template = `<tr data-coupon="{{ d.id }}">
<td>{{ d.id }}</td>
<td>{{ d.realname }}</td>
<td>{{ d.account }}</td>
<td style="text-align:center;"><a href="javascript:;" onclick="deleteCoupon(this)" class="text-color">删除</a></td>
</tr>`;
laytpl(template).render(data, function(string){
$(event).parents('.discount-cont').find('.layui-table tbody').append(string);
layer.closeAll();
});
getCoupon();
}
})
// 删除优惠券
function deleteCoupon(e){
$(e).parents('tr').remove();
getCoupon();
}
function getCoupon() {
var coupon = [];
$('.coupon').find('tr[data-coupon]').each(function (i, e) {
coupon.push($(e).attr('data-coupon'));
})
coupon_list = coupon.toString();
}
</script>
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" onclick="delRow(this,{{d.goods_id}})">删除</a>
</div>
</script>
{/block}

View File

@ -0,0 +1,643 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style>
.good-name, .good-price {
line-height: 34px;
}
.layui-form-item .layui-input-inline.end-time{
float: none;
}
</style>
{/block}
{block name="main"}
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>活动时间:</label>
<div class="layui-inline">
<div class="layui-input-inline">
<input type="text" id="start_time" name="start_time" value="{:date('Y-m-d H:i:s', $info.start_time)}" lay-verify="required" class="layui-input len-mid" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<span class="layui-form-mid">-</span>
<div class="layui-input-inline end-time">
<input type="text" id="end_time" name="end_time" value="{:date('Y-m-d H:i:s', $info.end_time)}" lay-verify="required|time" class="layui-input len-mid" autocomplete="off" readonly>
<input type="hidden" id="old_end_time" value="{$info.end_time}">
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>活动banner</label>
<div class="layui-input-block">
<div class="js-store-image"></div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>活动价格:</label>
<div class="layui-input-block">
<input type="text" name="activity_price" placeholder="请输入活动价格" value="{$info.activity_price}" lay-verify="required|number" autocomplete="off" class="layui-input len-short">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">活动内容:</label>
<div class="layui-input-block">
<textarea class="layui-textarea len-long" name="remark" maxlength="300">{$info.remark}</textarea>
</div>
</div>
<!-- <div class="layui-form-item">-->
<!-- <label class="layui-form-label">音频路径</label>-->
<!-- <div class="layui-input-block">-->
<!-- <input type="text" name="audio_url" value="{$info.audio_url}" placeholder="在此输入外链音频频地址" autocomplete="off" class="layui-input len-long">-->
<!-- </div>-->
<!-- <div class="file-title word-aux">-->
<!-- <div>注意事项:</div>-->
<!-- <ul>-->
<!-- <li>2、必须上传.mp3格式</li>-->
<!-- </ul>-->
<!-- </div>-->
<!-- </div>-->
<div class="layui-form-item">
<label class="layui-form-label">分享海报:</label>
<div class="layui-input-block len-mid">
<select name="template_id" lay-search lay-verify="">
<option value="0">请选择活动分享海报</option>
{foreach name="$poster_list" item="vo"}
<option value="{$vo['template_id']}" {if $info.template_id eq $vo.template_id}selected{/if}>{$vo['poster_name']}</option>
{/foreach}
</select>
</div>
</div>
{if $form_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">活动表单:</label>
<div class="layui-input-block len-mid">
<select name="form_id">
<option value="0">请选择活动表单</option>
{foreach name="$form_list" item="vo"}
<option value="{$vo.id}" {if $info.form_id eq $vo.id}selected{/if}>{$vo.form_name}</option>
{/foreach}
</select>
</div>
</div>
{/if}
<div class="layui-form-item">
<label class="layui-form-label">收款方名称</label>
<div class="layui-input-block">
<input type="text" name="payee_name" value="{$info.payee_name}" autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">收款方账号</label>
<div class="layui-input-block">
<input type="text" name="payee_account" value="{$info.payee_account}" autocomplete="off" class="layui-input len-long">
</div>
</div>
{if $divide_money_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">分账账号:</label>
<div class="layui-input-block">
<div class="divide-item coupon">
<div class="discount-cont">
<div><a href="javascript:;" class="text-color select-divide">选择账号</a></div>
<div>
<table class="layui-table" lay-skin="nob">
<colgroup>
<col width="5%">
<col width="30%">
<col width="30%">
<col width="20%">
</colgroup>
<thead>
<tr>
<th>账号ID</th>
<th>企业名称</th>
<th>账号</th>
<th style="text-align:center;">操作</th>
</tr>
</thead>
<tbody>
{if isset($divide_list) && !empty($divide_list)}
{foreach $divide_list as $k => $vo}
<tr data-coupon="{$vo.id}">
<td>{$vo.id}</td>
<td>{$vo.realname}</td>
<td>{$vo.account}</td>
<td style="text-align:center;"><a href="javascript:;" onclick="deleteCoupon(this)" class="text-color">删除</a></td>
</tr>
{/foreach}
{/if}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
{/if}
<div class="layui-form-item goods_list">
<label class="layui-form-label">活动商品:</label>
<div class="layui-input-block">
<table id="selected_goods_list" lay-filter="selected_goods_list"></table>
<button class="layui-btn" onclick="addGoods()">选择商品</button>
<span class="goods_num">已选商品(<span id="goods_num" class="text-color">{$info.goods_num}</span></span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">活动详情:</label>
<div class="layui-input-block special-length">
<script id="container" name="content" type="text/plain" style="width:100%;height:500px;"></script>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">购买协议:</label>
<div class="layui-input-block special-length">
<script id="buyAgreement" name="buy_agreement" type="text/plain" style="width:100%;height:500px;"></script>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟销量</label>
<div class="layui-input-block">
<input type="number" value="{$info.virtual_sale}" name="virtual_sale" autocomplete="off" class="layui-input len-mid">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否参与循环消费:</label>
<div class="layui-input-block">
<input type="radio" name="is_recycle_integral" value="1" title="是" {if $info.is_recycle_integral == 1} checked {/if} >
<input type="radio" name="is_recycle_integral" value="0" title="否" {if $info.is_recycle_integral == 0} checked {/if} >
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
<input type="hidden" name="activity_id" value="{$info.activity_id}" />
<input type="hidden" class="start-time-hide" value="{$info.start_time}" />
<input type="hidden" class="end-time-hide" value="{$info.end_time}" />
<input type="hidden" value="{$info.content}" id="content" />
<input type="hidden" value="{$info.buy_agreement}" id="buyContent" />
</div>
{/block}
{block name="script"}
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script src="__STATIC__/ext/drag-arrange.js"></script>
<script type="text/html" id="storeImageTpl">
{{# if(d.list.length){ }}
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="item upload_img_square_item" data-index="{{i}}">
<div class="img-wrap">
<img src="{{ns.img(d.list[i],'small')}}" layer-src>
</div>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
<div class="replace_img" data-index="{{i}}">点击替换</div>
</div>
</div>
{{# } }}
{{# if(d.list.length < d.max){ }}
<div class="item js-add-image upload_img_square">+</div>
{{# } }}
{{# }else{ }}
<div class="item js-add-image upload_img_square">+</div>
{{# } }}
</script>
<script type="text/html" id="couponList">
<div class="gift-box">
<div class="single-filter-box">
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="coupon_name" placeholder="请输入账号" class="layui-input len-mid">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="coupon-search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<table id="coupon_list" lay-filter="coupon_list"></table>
</div>
</script>
<script type="text/html" id="couponOperation">
{{# var select_coupon_list = ','+coupon_list+','}}
{{# if(select_coupon_list.indexOf(','+d.id+',') != -1){ }}
<p title="该账号已参加">已添加</p>
{{# }else{ }}
<a class="layui-btn" lay-event="add">添加</a>
{{# } }}
</script>
<script>
var ue = UE.getEditor('container');
ue.ready(function() { //对编辑器的操作最好在编辑器ready之后再做
var con = $("#content").val();
ue.setContent(con); //获取html内容返回: <p>hello</p>
});
var ues = UE.getEditor('buyAgreement');
ues.ready(function() { //对编辑器的操作最好在编辑器ready之后再做
var con = $("#buyContent").val();
ues.setContent(con); //获取html内容返回: <p>hello</p>
});
var goodsId = {:json_encode($info.goods_ids)}, selectedGoodsId = [], goods_list = [];
var upload,laytpl,storeImage = '{$info.activity_image}'.split(','),tableData = {:json_encode($info.goods)};
const STORE_IMAGE_MAX = 5;
var coupon_list = {:json_encode($info.divide_ids)};
layui.use(['form', 'laydate','laytpl'], function() {
var form = layui.form,
laydate = layui.laydate,
repeat_flag = false,
minDate = "";
form.render();
laytpl = layui.laytpl;
var now_time = ((new Date()).getTime())/1000;
var start_time = ((new Date($("#start_time").val())).getTime())/1000;
var old_end_time = ((new Date($("#end_time").val())).getTime())/1000;
if(now_time <= start_time){
//开始时间
laydate.render({
elem: '#start_time', //指定元素
type: 'datetime',
value: ns.time_to_date($(".start-time-hide").val()),
done: function(value) {
minDate = value;
reRender();
}
});
}
if(now_time <= old_end_time){
//结束时间
laydate.render({
elem: '#end_time', //指定元素
type: 'datetime',
value: ns.time_to_date($(".end-time-hide").val())
});
}
/**
* 重新渲染结束时间
* */
function reRender() {
$("#end_time").remove();
$(".end-time").html('<input type="text" id="end_time" name="end_time" placeholder="请输入结束时间" lay-verify="required|time" class = "layui-input len-mid" autocomplete="off" readonly> ');
laydate.render({
elem: '#end_time',
type: 'datetime',
min: minDate
});
}
/**
* 表单验证
*/
form.verify({
time: function(value) {
var now_time = ((new Date()).getTime())/1000;
var start_time = ((new Date($("#start_time").val())).getTime())/1000;
var end_time = ((new Date(value)).getTime())/1000;
var old_end_time = $("#old_end_time").val();
if(old_end_time > end_time){
return '结束时间不能小于之前设置的结束时间!'
}
if (now_time > end_time) {
return '结束时间不能小于当前时间!'
}
if (start_time > end_time) {
return '结束时间不能小于开始时间!';
}
},
});
// 添加门店图片
$("body").on("click", ".js-add-image", function () {
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (storeImage.length < STORE_IMAGE_MAX) storeImage.push(data[i].pic_path);
}
refreshStoreImage();
}, 5, 1);
});
//渲染门店图片
function refreshStoreImage() {
var store_image_template = $("#storeImageTpl").html();
var data = {
list: storeImage,
max: STORE_IMAGE_MAX
};
laytpl(store_image_template).render(data, function (html) {
$(".js-store-image").html(html);
//加载图片放大
loadImgMagnify();
if (storeImage.length) {
//预览
$(".js-store-image .js-preview").click(function () {
$(this).parent().prev().find("img").click();
});
//图片删除
$(".js-store-image .js-delete").click(function () {
var index = $(this).attr("data-index");
storeImage.splice(index, 1);
refreshStoreImage();
});
// 拖拽
$('.js-store-image .upload_img_square_item').arrangeable({
//拖拽结束后执行回调
callback: function (e) {
var indexBefore = $(e).attr("data-index");//拖拽前的原始位置
var indexAfter = $(e).index();//拖拽后的位置
var temp = storeImage[indexBefore];
storeImage[indexBefore] = storeImage[indexAfter];
storeImage[indexAfter] = temp;
refreshStoreImage();
}
});
}
//最多传十张图
if (storeImage.length < STORE_IMAGE_MAX) {
$(".js-add-image").show();
} else {
$(".js-add-image").hide();
}
});
}
refreshStoreImage();
/**
* 表单提交
*/
form.on('submit(save)', function(data){
if (!goodsId.length) {
layer.msg("请选择活动商品!", {icon: 5, anim: 6});
return;
}
data.field.goods_ids = goodsId;
ue.ready(function() { //对编辑器的操作最好在编辑器ready之后再做
html = ue.getContent(); //获取html内容返回: <p>hello</p>
});
ues.ready(function() { //对编辑器的操作最好在编辑器ready之后再做
htmls = ues.getContent(); //获取html内容返回: <p>hello</p>
});
data.field.content = html;
data.field.buy_agreement = htmls;
data.field.activity_image = storeImage;
var divide_money_ids = coupon_list.split(',');
data.field.divide_money_ids = divide_money_ids;
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("activity://shop/activity/edit"),
data: data.field,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续操作'],
yes: function(){
location.href = ns.url("activity://shop/activity/lists");
},
btn2: function() {
location.reload();
}
});
}else{
layer.msg(res.message);
}
}
})
});
});
/*
* 渲染表格
* */
renderTable(tableData);
// 表格渲染
function renderTable(goods_list) {
//展示已知数据
table = new Table({
elem: '#selected_goods_list',
page: false,
limit: Number.MAX_VALUE,
cols: [
[{
title: '商品名称',
width: '26%',
unresize: 'false',
templet: function(data) {
var html = '';
html += `
<div class="goods-title">
<div class="goods-img">
<img layer-src src="${data.goods_image ? ns.img(data.goods_image.split(",")[0],'small') : ''}" alt="">
</div>
<p class="multi-line-hiding goods-name" data-goods_id="${data.goods_id}" title="${data.goods_name}">${data.goods_name}</p>
</div>
`;
return html;
}
}, {
field: 'price',
title: '商品价格',
unresize: 'false',
align: 'right',
width: '15%',
templet: function(data) {
return '<p class="line-hiding" title="'+ data.price +'"><span class="goods-price">' + data.price +'</span></p>';
}
}, {
field: 'goods_stock',
title: '库存',
unresize: 'false',
width: '10%',
templet: function(data) {
return '<p class="stock">' + data.goods_stock +'</p>';
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
],
data: goods_list,
toolbar: '#toolbarOperation'
});
/**
* 批量操作
*/
table.toolbar(function(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "group-price":
editInput(0,obj);
break;
case "purchase-num":
editInput(1,obj);
break;
}
});
}
/**
* 添加商品
*/
function addGoods(){
goodsSelect(function(res) {
if (!res.length) return false;
goodsId = [];
goods_list = [];
for(var i=0;i<res.length;i++) {
goodsId.push(res[i].goods_id);
res[i].buy_num = 2;
goods_list.push(res[i]);
}
renderTable(goods_list);
$("input[name='goods_ids']").val(JSON.stringify(goodsId));
$("#goods_num").html(goodsId.length);
selectedGoodsId = goodsId.toString();
}, selectedGoodsId);
goods_list.splice(0,goods_list.length);
}
function delRow(obj,id) {
for (var i = 0; i < goods_list.length; i++){
if (goods_list[i].goods_id == parseInt(id)){
goods_list.splice(i,1);
}
}
if(goodsId.indexOf(id) != -1) goodsId.splice(goodsId.indexOf(id),1);
$("#goods_num").html(goodsId.length);
selectedGoodsId = goodsId.toString();
$(obj).parents("tr").remove();
}
function back() {
location.href = ns.url("activity://shop/activity/lists");
}
$('body').on('click', '.divide-item .select-divide', function(e){
var event = this;
layer.open({
type: 1,
area: ["1200px","600px"],
title: '账号列表',
skin: 'select-coupon-layer',
content: $("#couponList").html()
});
couponTable = new Table({
elem: "#coupon_list",
url: ns.url("dividemoney://shop/account/list"),
where: {'status': 1},
cols: [
[{
title: '企业名称',
unresize: 'false',
width: '30%',
field: 'realname',
}, {
title: '账号',
unresize: 'false',
width: '30%',
field: 'account',
},{
field: 'divide_rate',
title: '分佣比例(%)',
unresize: 'false',
width: '20%',
templet: function(data){
return data.divide_rate + '%';
}
}, {
title: '操作',
toolbar: '#couponOperation',
unresize: 'false',
align:'right'
}]
]
});
couponTable.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case "add":
addcoupon(data);
break;
}
});
function addcoupon(data){
var template = `<tr data-coupon="{{ d.id }}">
<td>{{ d.id }}</td>
<td>{{ d.realname }}</td>
<td>{{ d.account }}</td>
<td style="text-align:center;"><a href="javascript:;" onclick="deleteCoupon(this)" class="text-color">删除</a></td>
</tr>`;
laytpl(template).render(data, function(string){
$(event).parents('.discount-cont').find('.layui-table tbody').append(string);
layer.closeAll();
});
getCoupon();
}
})
// 删除优惠券
function deleteCoupon(e){
$(e).parents('tr').remove();
getCoupon();
}
function getCoupon() {
var coupon = [];
$('.coupon').find('tr[data-coupon]').each(function (i, e) {
coupon.push($(e).attr('data-coupon'));
})
coupon_list = coupon.toString();
}
</script>
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" onclick="delRow(this,{{d.goods_id}})">删除</a>
</div>
</script>
{/block}

View File

@ -0,0 +1,444 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style>
.single-filter-box button {margin-bottom: 20px;}
.marked-message {height: 48px;background: #FFF5ED;font-size: 14px;font-family: Source Han Sans SC;font-weight: 400;color: #666;line-height: 50px;padding: 0 16px;display: flex;}
.promote-flex {display: flex;margin-top: 15px;padding: 0 10px 0;}
.promote-img {background-color: #f8f8f8;display: flex;justify-content: center;align-items: center;width: 200px;height: 200px;}
.promote-img img {width: 140px;height: 140px;}
.label-width {width: 100px;}
.block-left {margin-left: 100px !important;display: flex;}
.promote-download {margin-left: 20px;}
.h5-path{margin-left: 20px;width: 300px;}
.h5-path .fuzhi{width: 1px;height: 0px;border: 0px;}
.h5-path span{display: block;margin-bottom: 10px;}
.h5-path p input{height: 30px;line-height: 30px;border: 1px solid #e6e6e5;width: 150px;padding: 0px 5px;border-radius: 5px;margin-right: 10px;}
.layui-layout-admin.admin-style-2 .body-content{padding-top: 15px !important;}
.layui-layout-admin.admin-style-2 .single-filter-box button{margin-bottom: 0;}
.layui-layout-admin.admin-style-2 .layui-form-item .layui-input-inline{background-color: #fff;}
.layui-layout-admin.admin-style-2 .table-tab .layui-tab-title{margin-bottom: 15px;}
</style>
{/block}
{block name="main"}
<div class="single-filter-box">
<button class="layui-btn" onclick="add()">添加活动</button>
</div>
<!-- 搜索框 -->
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<form class="layui-colla-content layui-form layui-show">
<div class="layui-form-item">
<!-- <div class="layui-inline">-->
<!-- <label class="layui-form-label">商品名称:</label>-->
<!-- <div class="layui-input-inline">-->
<!-- <input type="text" name="goods_name" placeholder="请输入商品名称" autocomplete="off" class="layui-input">-->
<!-- </div>-->
<!-- </div>-->
<div class="layui-inline">
<label class="layui-form-label">活动时间:</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="start_time" placeholder="开始时间" id="start_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="end_time" placeholder="结束时间" id="end_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
</div>
<div class="form-row">
<button type="button" class="layui-btn" lay-filter="search" lay-submit>筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>
<div class="layui-tab table-tab" lay-filter="groupbuy_tab">
<ul class="layui-tab-title">
<li class="layui-this" data-status="">全部</li>
<li data-status="0">未开始</li>
<li data-status="1">进行中</li>
<li data-status="2">已结束</li>
</ul>
<div class="layui-tab-content">
<!-- 列表 -->
<table id="activity_list" lay-filter="activity_list"></table>
</div>
</div>
<!-- 商品 -->
<script type="text/html" id="goods">
{{# for(let key in d.goods){ }}
<div class="table-title" style="margin-bottom: 5px;">
<div class="title-pic">
{{# if(d.goods[key].goods_image){ }}
<img layer-src="{{ns.img(d.goods[key].goods_image.split(',')[0],'big')}}" src="{{ns.img(d.goods[key].goods_image.split(',')[0],'small')}}"/>
{{# } }}
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color-sub" title="{{d.goods[key].goods_name}}">{{d.goods[key].goods_name}}</a>
</div>
</div>
{{# } }}
</script>
<!-- 时间 -->
<script id="time" type="text/html">
<div class="layui-elip">开始:{{ns.time_to_date(d.start_time)}}</div>
<div class="layui-elip">结束:{{ns.time_to_date(d.end_time)}}</div>
</script>
<script id="payee" type="text/html">
{{# if(d.payee_name && d.payee_account){ }}
<div class="layui-elip">收款方名称:{{ d.payee_name }}</div>
<div class="layui-elip">收款方账号:{{ d.payee_account }}</div>
{{# }else{ }}
<div class="layui-elip">收款方:总平台</div>
{{# } }}
</script>
<!-- 商品推广 -->
<script type="text/html" id="promote">
<div>
<div class="marked-message">
<p>活动可分享至多个渠道推广,增加商品曝光率,提升商品分享打开率。</p>
</div>
<div class="promote-flex">
<div class="promote-img">
<img src="{{ ns.img(d.h5.path) }}" alt="推广二维码">
</div>
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label label-width">选择渠道:</label>
<div class="layui-input-block block-left">
<input type="radio" name="promote_type" value="1" title="H5" checked lay-filter="promote_type" >
<input type="radio" name="promote_type" value="2" title="小程序" lay-filter="promote_type">
</div>
</div>
<div class="h5-path">
<span>推广链接</span>
<p class="tips text-color"><input type="text" value="{{d.h5.url}}" readonly /><a class="layui-btn" href="javascript:ns.copy('h5_url_{{ d.id }}');">复制</a></p>
<input type="text" id="h5_url_{{ d.id }}" value="{{d.h5.url}}" readonly class="fuzhi"/>
</div>
<div class="promote-download">
<a class="text-color" href="{{ ns.img(d.h5.path) }}" download>下载二维码</a>
</div>
</div>
</div>
</div>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="operation-wrap" data-groupbuy-id="{{d.groupbuy_id}}">
<div class="popup-qrcode-wrap" style="display: none"><img class="popup-qrcode-loadimg" src="__STATIC__/loading/loading.gif"/></div>
<div class="table-btn">
{{# if(d.status == 1){ }}
<a class="layui-btn text-color" lay-event="select">推广</a>
{{# } }}
<a class="layui-btn" lay-event="edit">编辑</a>
{{# if(d.status == 0){ }}
<a class="layui-btn" lay-event="del">删除</a>
{{# }else if(d.status == 2){ }}
<a class="layui-btn" lay-event="del">删除</a>
{{# } }}
</div>
</div>
</script>
{/block}
{block name="script"}
<script>
var laytpl;
layui.use(['form', 'element', 'laydate','laytpl'], function() {
var table,
form = layui.form,
element = layui.element,
laydate = layui.laydate,
repeat_flag = false; //防重复标识
laytpl = layui.laytpl,
form.render();
//开始时间
laydate.render({
elem: '#start_time', //指定元素
type: 'datetime'
, done: function (value, date, endDate) {
start_time = ns.date_to_time(value);
}
});
//结束时间
laydate.render({
elem: '#end_time', //指定元素
type: 'datetime'
, done: function (value, date, endDate) {
end_time = ns.date_to_time(value);
}
});
//监听Tab切换以改变地址hash值
element.on('tab(groupbuy_tab)', function() {
table.reload({
page: {
curr: 1
},
where: {
'status': this.getAttribute('data-status')
}
});
});
table = new Table({
elem: '#activity_list',
url: ns.url("activity://shop/activity/lists"),
cols: [
[{
title: '商品信息',
unresize: 'false',
width: '20%',
templet: '#goods'
}, {
title: '活动海报',
unresize: 'false',
width: '10%',
sort:true,
templet: function(data) {
return '<a href="javascript:;" class="multi-line-hiding text-color-sub" >' + data.poster_title +'</a>'
}
}, {
title: '活动表单',
unresize: 'false',
width: '10%',
sort:true,
templet: function(data) {
return '<a href="javascript:;" class="multi-line-hiding text-color-sub" >' + data.form_title +'</a>'
}
},{
field: 'sale_num',
title: '活动销量',
unresize: 'false',
sort:true,
width: '8%'
}, {
title: '活动时间',
unresize: 'false',
width: '15%',
templet: '#time'
}, {
title: '收款方',
unresize: 'false',
width: '15%',
templet: '#payee'
}, {
title: '状态',
unresize: 'false',
width: '10%',
templet: function(data) {
var status_text = '';
switch (data.status){
case 0:
status_text = '未开始';
break;
case 1:
status_text = '进行中';
break;
case 2:
status_text = '已结束';
break;
}
return status_text;
},
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align : 'right'
}]
],
});
table.on("sort",function (obj) {
table.reload({
page: {
curr: 1
},
where: {
order:obj.field,
sort:obj.type
}
});
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
//监听Tab切换
element.on('tab(status)', function(data) {
var status = $(this).attr("data-status");
table.reload({
page: {
curr: 1
},
where: {
'status': status
}
});
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit': //编辑
location.href = ns.url("activity://shop/activity/edit", {"activity_id": data.activity_id});
break;
case 'del': //删除
deleteGroupbuy(data.activity_id);
break;
case 'select': //推广
groupbuyUrl(data);
break;
}
});
/**
* 删除
*/
function deleteGroupbuy(activity_id) {
layer.confirm('确定要删除该拓客活动吗?', function() {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("activity://shop/activity/delete"),
data: {
activity_id: activity_id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload({
page: {
curr: 1
},
});
}
}
});
}, function() {
layer.close();
repeat_flag = false;
});
}
//使结束
function closeGroupbuy(groupbuy_id) {
layer.confirm('确定要结束该团购活动吗?', function() {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("activity://shop/activity/finish"),
data: {
groupbuy_id: groupbuy_id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload();
}
}
});
}, function() {
layer.close();
repeat_flag = false;
});
}
// 团购推广
function groupbuyUrl(data) {
$.ajax({
type: "POST",
url: ns.url("activity://shop/activity/activityUrl"),
data: {
'activity_id': data.activity_id
},
dataType: 'JSON',
success: function (res) {
if(res.code==0){
res.data.id = data.groupbuy_id;
laytpl($("#promote").html()).render(res.data, function (html) {
layer.open({
type: 1,
area: ['600px', '450px'],
offset: '155px',
title: ['推广'],
content: html,
success: function(){
// 推广渠道监听
form.on('radio(promote_type)', function(radio){
if(radio.value == 1) {
var no_html = "";
no_html += '<img src="'+ res.data.h5.path +'"/>';
$('.promote-img').html(no_html);
// $('.promote-img img').attr('src',res.data.h5.path);
$('.promote-download a').attr('href',res.data.h5.path);
$(".h5-path").show();
}else {
if(res.data.weapp.path == ""){
var no_html = "";
no_html += '<span>小程序配置错误</span>';
$('.promote-img').html(no_html);
}else{
$('.promote-img img').attr('src',res.data.weapp.path);
$('.promote-download a').attr('href',res.data.weapp.path)
}
$(".h5-path").hide();
}
});
}
});
form.render();
});
}else{
layer.msg('加载失败,请重试');
}
}
});
}
});
function add() {
location.href = ns.url("activity://shop/activity/add");
}
</script>
{/block}

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

View File

@ -0,0 +1,22 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\ali1688\api\controller;
use app\api\controller\BaseApi;
class Notify extends BaseApi
{
public function index()
{
try {
event('Notify1688Change', input());
} catch (\Exception $e) {
echo $e->getMessage();
}
}
}

View File

@ -0,0 +1,31 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
* =========================================================
*/
return [
// 自定义模板页面类型,格式:[ 'title' => '页面类型名称', 'name' => '页面标识', 'path' => '页面路径', 'value' => '页面数据json格式' ]
'template' => [],
// 后台自定义组件——装修
'util' => [],
// 自定义页面路径
'link' => [],
// 自定义图标库
'icon_library' => [],
// uni-app 组件,格式:[ 'name' => '组件名称/文件夹名称', 'path' => '文件路径/目录路径' ]多个逗号隔开自定义组件名称前缀必须是diy-,也可以引用第三方组件
'component' => [],
// uni-app 页面,多个逗号隔开
'pages' => [],
// 模板信息,格式:'title' => '模板名称', 'name' => '模板标识', 'cover' => '模板封面图', 'preview' => '模板预览图', 'desc' => '模板描述'
'info' => [],
// 主题风格配色格式可以自由定义扩展【在uni-app中通过this.themeStyle... 获取定义的颜色字段例如this.themeStyle.main_color】
'theme' => [],
// 自定义页面数据,格式:[ 'title' => '页面名称', 'name' => "页面标识", 'value' => [页面数据json格式] ]
'data' => []
];

View File

@ -0,0 +1,35 @@
<?php
// 事件定义文件
return [
'bind' => [],
'listen' => [
//展示活动
'ShowPromotion' => [
'addon\ali1688\event\ShowPromotion',
],
// 支付成功
'OrderPay' => [
'addon\ali1688\event\OrderPay',
],
// 自动下单
'CronAutoAliOrderBuy' => [
'addon\ali1688\event\Ali1688OrderBuy',
],
'OrderRefundFinish' => [ // 退款成功
// 'addon\ali1688\event\Ali1688OrderRefund',
],
'AutoAddGoods' => [ //自动添加商品
'addon\ali1688\event\AutoAddGoods',
],
'DeleteRecycleGoods' => [ //删除商品
'addon\ali1688\event\DeleteRecycleGoods',
],
'Notify1688Change' => [ //1688状态通知
'addon\ali1688\event\Notify1688Change'
],
'OrderCreate' => [ // 订单创建
'addon\ali1688\event\OrderCreate',
],
],
'subscribe' => [],
];

View File

@ -0,0 +1,20 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
return [
'name' => 'ali1688',
'title' => '1688精选',
'description' => '1688精选供应链,无货源备货,无人值守全自动营销',
'type' => 'tool', //插件类型 system :系统插件(自动安装), promotion:扩展营销插件 tool:工具插件
'status' => 1,
'author' => '',
'version' => '1.0.0',
'version_no' => '2024010114',
'content' => '',
];

View File

@ -0,0 +1,91 @@
<?php
// +----------------------------------------------------------------------
// | 店铺端菜单设置
// +----------------------------------------------------------------------
return [
[
'name' => 'PROMOTION_ALI1688',
'title' => '1688精选',
'url' => 'ali1688://shop/order/lists',
'parent' => 'PROMOTION_CENTER',
'is_show' => 1,
'sort' => 100,
'child_list' => [
[
'name' => 'ALI1688SHOP_ORDER',
'title' => '采购订单',
'url' => 'ali1688://shop/order/lists',
'is_show' => 1,
'sort' => 1,
],
[
'name' => 'ALI1688SHOP_GOODS',
'title' => '选品入库',
'url' => 'ali1688://shop/goods/lists',
'is_show' => 1,
'sort' => 2,
'child_list' => [
[
'name' => 'ALI1688SHOP_SERVICE',
'title' => '选品中心',
'url' => 'ali1688://shop/goods/servicegoods',
'is_show' => 0,
'sort' => 1,
],
[
'name' => 'ALI1688SHOP_ADD',
'title' => '添加商品',
'url' => 'ali1688://shop/goods/add',
'is_show' => 0,
'sort' => 2,
],
[
'name' => 'ALI1688SHOP_REMOVE',
'title' => '删除',
'url' => 'ali1688://shop/goods/remove',
'is_show' => 0,
'sort' => 3,
]
]
],
[
'name' => 'ALI1688GOODSTEMP',
'title' => '价格模版',
'url' => 'ali1688://shop/template/lists',
'is_show' => 1,
'sort' => 3,
'child_list' => [
[
'name' => 'ALI1688SHOP_ADDTEMPLATE',
'title' => '添加模版',
'url' => 'ali1688://shop/template/add',
'is_show' => 0,
'sort' => 1,
],
[
'name' => 'ALI1688SHOP_EDITTEMPLATE',
'title' => '编辑',
'url' => 'ali1688://shop/template/edit',
'is_show' => 0,
'sort' => 1,
],
[
'name' => 'ALI1688SHOP_REMOVETEMPLATE',
'title' => '删除',
'url' => 'ali1688://shop/template/remove',
'is_show' => 0,
'sort' => 1,
]
]
],
[
'name' => 'ALI1688CONFIG',
'title' => '系统设置',
'url' => 'ali1688://shop/config/basics',
'is_show' => 1,
'sort' => 3,
'child_list' => []
]
]
]
];

View File

@ -0,0 +1,25 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\ali1688\event;
use addon\ali1688\model\Order;
class Ali1688OrderBuy
{
public function handle($params = [])
{
// 判断:是否开启自动下单
try {
$order_id = $params['relate_id'] ?? 0;
return (new Order())->authBuyOrder($order_id);
} catch (\Exception $e) {
return $e->getMessage();
}
}
}

View File

@ -0,0 +1,19 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\ali1688\event;
use addon\ali1688\model\Order;
class Ali1688OrderRefund
{
public function handle($data)
{
(new Order())->refundOrder($data);
return success(0, '供应链退款执行完成');
}
}

View File

@ -0,0 +1,31 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
* =========================================================
*/
namespace addon\ali1688\event;
use addon\ali1688\model\Config;
use addon\ali1688\model\Goods;
class AutoAddGoods
{
public function handle($params)
{
try {
// 判断:自动添加商品
$siteId = $params['relate_id'] ?? 0;
$config = (new Config())->getConfig($siteId)['data']['value'] ?? [];
if (isset($config['isAutoGoodsAdd']) && (int)$config['isAutoGoodsAdd'] == 1) {
(new Goods($siteId))->AutoAddGoods($siteId);
}
} catch (\Exception $e) {
}
return success(0, '添加成功');
}
}

View File

@ -0,0 +1,28 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
* =========================================================
*/
namespace addon\ali1688\event;
use addon\ali1688\model\Goods;
class DeleteRecycleGoods
{
public function handle($params)
{
try {
(new Goods($params['site_id']))->deleteRecycleGoods($params);
} catch (\Exception $e) {
}
return success(0, '删除成功');
}
}

View File

@ -0,0 +1,23 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\ali1688\event;
/**
* 应用安装
*/
class Install
{
/**
* 执行安装
*/
public function handle()
{
return success();
}
}

View File

@ -0,0 +1,24 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
* =========================================================
*/
namespace addon\ali1688\event;
use addon\ali1688\model\NotifyChange;
class Notify1688Change
{
public function handle($params)
{
try {
(new NotifyChange())->Notify($params);
} catch (\Exception $e) {
echo 'fial';
}
}
}

View File

@ -0,0 +1,16 @@
<?php
namespace addon\ali1688\event;
use addon\ali1688\model\Order;
use think\facade\Log;
class OrderCreate
{
public function handle($order)
{
try {
(new Order($order['site_id']))->orderCreate($order);
} catch (\Exception $e) {
Log::debug('1688 - api请求下单失败' . $e->getMessage());
}
return success(0, '下单触发');
}
}

View File

@ -0,0 +1,25 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\ali1688\event;
use addon\ali1688\model\Order;
use think\facade\Log;
class OrderPay
{
public function handle($order)
{
try {
(new Order($order['site_id']))->orderPay($order);
} catch (\Exception $e) {
Log::debug('1688 - api请求下单失败' . $e->getMessage());
}
return success(0, '下单触发');
}
}

View File

@ -0,0 +1,43 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\ali1688\event;
/**
* 店铺活动
*/
class ShowPromotion
{
/**
* 活动展示
* @return array
*/
public function handle()
{
$data = [
'shop' => [
[
//插件名称
'name' => 'ali1688',
//展示分类根据平台端设置admin平台营销shop店铺营销member:会员营销, tool:应用工具)
'show_type' => 'tool',
//展示主题
'title' => '1688供应链',
//展示介绍
'description' => '1688精选商品供应链,自动营销,无需备货',
//展示图标
'icon' => 'addon/ali1688/icon.png',
//跳转链接
'url' => 'ali1688://shop/order/lists',
]
]
];
return $data;
}
}

View File

@ -0,0 +1,24 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\ali1688\event;
/**
* 应用卸载
*/
class UnInstall
{
/**
* 执行卸载
*/
public function handle()
{
return success();
}
}

BIN
addon/ali1688/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -0,0 +1,314 @@
<?php
namespace addon\ali1688\model;
class Choice extends CloudApi
{
/***
* 添加产品关注
* @param $productId
* @return bool
* @throws \Exception
*/
public function followGoods($productId)
{
// 获取基本参数
$result = $this->requestApi('com.alibaba.product/alibaba.product.follow', ['productId' => $productId]);
$result = json_decode($result, true);
if ($result['code'] == 0) {
return true;
} else {
return $result;
}
}
/***
* 解除关注
* @param $productId
* @return mixed|true
* @throws \Exception
*/
public function unfollowGoods($productId)
{
// 获取基本参数
$result = $this->requestApi('com.alibaba.product/alibaba.product.unfollow.crossborder', ['productId' => $productId]);
$result = json_decode($result, true);
if ($result['code'] == 0) {
return true;
} else {
return $result;
}
}
//关键字搜索商品列表
public function productlist($data)
{
$api = 'com.alibaba.fenxiao/jxhy.product.getPageList';
if(isset($data['filters'])&&$data['filters']){
$data['filters'] = json_encode(array_values($data['filters']),true);
}else{
$data['filters'] = json_encode(['isOnePsaleFreePost']);
}
$result = json_decode($this->requestApi($api, $data), true);
if (isset($result['result']['success']) && isset($result['result']['result'])) {
$results = $result['result']['result'];
$itemId = array_column($results, 'itemId');
$info = model('supply_goods_warehousing')->getColumn([['open_offer_id', 'in', $itemId], ['site_id', '=', $this->site_id]], 'open_offer_id', 'open_offer_id');
foreach ($results as &$item) {
if (isset($info[$item['itemId']])) {
$item['is_warehousing'] = 1;
} else {
$item['is_warehousing'] = 0;
}
}
$result['result']['result'] = $results;
}
return $result;
}
// public function productlist($data)
// {
//
// $data = $this->handleSearchData($data);
// $api = 'com.alibaba.fenxiao/alibaba.pifatuan.product.list';
// $result = json_decode($this->requestApi($api, $data), true);
// if (isset($result['result']['success']) && isset($result['result']['result'])) {
// $results = $result['result']['result']['resultList'];
// $pageInfo = ['currentPage' => $result['result']['result']['pageIndex'],
// 'pageSize' => $result['result']['result']['sizePerPage'],
// 'totalRecords' => $result['result']['result']['totalRecords'],
// ];
// $itemId = array_column($results, 'itemId');
// $info = model('supply_goods_warehousing')->getColumn([['open_offer_id', 'in', $itemId], ['site_id', '=', $this->site_id]], 'open_offer_id', 'open_offer_id');
// foreach ($results as &$item) {
// if (isset($info[$item['itemId']])) {
// $item['is_warehousing'] = 1;
// } else {
// $item['is_warehousing'] = 0;
// }
// }
// $result['result']['result'] = $results;
// $result['result']['pageInfo'] = $pageInfo;
// }
// return $result;
// }
//获取商品详情
public function productInfoGet($itemIds)
{
$this->gatewayHost = 'https://gw.open.1688.com/openapi/param2/2/';
$api = 'com.alibaba.fenxiao/alibaba.pifatuan.product.detail.list';
if (is_array($itemIds)) {
return json_decode($this->requestApi($api, ['offerIds' => json_encode($itemIds)]), true);
}else{
return json_decode($this->requestApi($api, ['offerIds' => json_encode([$itemIds])]), true);
}
}
//获取物流模板详情
//模板ID,(是否查询子模板,是否查询子模板费率)默认不查子模板
public function productFreightTemplate($templateId,$querySubTemplate = true,$queryRate = true){
$api = 'com.alibaba.logistics/alibaba.logistics.myFreightTemplate.list.get';
$arr = [
'templateId' => $templateId,
'querySubTemplate' => $querySubTemplate,
'queryRate' => $queryRate
];
return json_decode($this->requestApi($api, $arr), true);
}
//添加分销店铺(买家)
public function buyerOutshopAdd()
{
$api = 'com.alibaba.fenxiao/alibaba.fenxiao.buyer.outshop.add';
return json_decode($this->requestApi($api, ['outShopCode' => $this->site_id, 'channel' => 'other']), true);
}
//添加分销商品关系(买家)
public function buyerOutproductRelationAdd()
{
$api = 'com.alibaba.fenxiao/alibaba.fenxiao.buyer.outproduct.relation.add';
$data = [
'channel' => 'other',
'outShopCode' => $this->site_id,
'outItemCode' => '6',
'openOfferId' => 'BgnuDNkhiXPv88gpE3sfbA==',
];
return json_decode($this->requestApi($api, $data), true);
}
//根据地址解析地区码
public function addressCodeParse($address)
{
$api = 'com.alibaba.trade/alibaba.trade.addresscode.parse';
return json_decode($this->requestApi($api, ['addressInfo' => $address]), true)['result'];
}
//查询是否开通免密支付
public function payProtocolPay()
{
$api = 'com.alibaba.trade/alibaba.trade.pay.protocolPay.isopen';
return json_decode($this->requestApi($api), true);
}
//查询订单可以支持的支付渠道
public function payWayQuery($orderId)
{
$api = 'com.alibaba.trade/alibaba.trade.payWay.query';
return json_decode($this->requestApi($api, ['orderId' => $orderId]), true);
}
//发起免密支付
public function protocolPayPreparePay($orderId)
{
$api = 'com.alibaba.trade/alibaba.trade.pay.protocolPay.preparePay';
return json_decode($this->requestApi($api, ['tradeWithholdPreparePayParam' => ['orderId' => $orderId]]), true);
}
//获取交易订单的物流信息
public function getLogisticsInfos($orderId)
{
$api = 'com.alibaba.logistics/alibaba.trade.getLogisticsInfos.buyerView';
return json_decode($this->requestApi($api, ['orderId' => $orderId]), true);
}
//获取交易订单的物流跟踪信息
public function getLogisticsTraceInfo($orderId)
{
$api = 'com.alibaba.logistics/alibaba.trade.getLogisticsTraceInfo.buyerView';
return json_decode($this->requestApi($api, ['orderId' => $orderId, 'webSite' => '1688']), true);
}
//查询退款退货原因(用于创建退款退货)
public function getRefundReasonList($data)
{
$api = 'com.alibaba.trade/alibaba.trade.getRefundReasonList';
$array = [
'orderId' => $data['orderId'],
'orderEntryIds' => $data['orderEntryIds'],
'goodsStatus' => $data['goodsStatus'],
];
return json_decode($this->requestApi($api, $array), true);
}
//创建退款退货申请
public function createRefund($data)
{
$api = 'com.alibaba.trade/alibaba.trade.createRefund';
$array = [
'orderId' => $data['orderId'],
'orderEntryIds' => $data['orderEntryIds'],
'disputeRequest' => $data['disputeRequest'],
'applyPayment' => $data['applyPayment'],
'applyCarriage' => $data['applyCarriage'],
'applyReasonId' => $data['applyReasonId'],
'description' => $data['description'],
'goodsStatus' => $data['goodsStatus'],
];
return json_decode($this->requestApi($api, $array), true);
}
//上传退款退货凭证
public function uploadRefundVoucher($imageData)
{
$api = 'com.alibaba.trade/alibaba.trade.uploadRefundVoucher';
return json_decode($this->requestApi($api, ['imageData' => $imageData]), true);
}
//查询退款单列表(买家视角)
public function queryOrderRefundList($data)
{
$api = 'com.alibaba.trade/alibaba.trade.refund.buyer.queryOrderRefundList';
return json_decode($this->requestApi($api, $data), true);
}
//查询退款单详情-根据订单ID买家视角
public function OpQueryBatchRefundByOrderIdAndStatus($data)
{
$api = 'com.alibaba.trade/alibaba.trade.refund.OpQueryBatchRefundByOrderIdAndStatus';
return json_decode($this->requestApi($api, $data), true);
}
//查询退款单详情-根据退款单ID买家视角
public function OpQueryOrderRefund($data)
{
$api = 'com.alibaba.trade/alibaba.trade.refund.OpQueryOrderRefund';
return json_decode($this->requestApi($api, $data), true);
}
//退款单操作记录列表(买家视角)
public function OpQueryOrderRefundOperationList($data)
{
$api = 'com.alibaba.trade/alibaba.trade.refund.OpQueryOrderRefundOperationList';
return json_decode($this->requestApi($api, $data), true);
}
//买家提交退款货信息
public function refundReturnGoods($data)
{
$api = 'com.alibaba.trade:alibaba.trade.refund.returnGoods';
return json_decode($this->requestApi($api, $data), true);
}
//订购的订单列表
public function pieceorderGet($data)
{
$api = 'cn.alibaba.open/alibaba.app.pieceorder.get';
return json_decode($this->requestApi($api, $data), true);
}
//app 在服务市场被订购的订单列表
public function orderGet($data)
{
$api = 'cn.alibaba.open/app.order.get';
return json_decode($this->requestApi($api, $data), true);
}
//获取某个应用最近一个月的到期订单信息
public function expireGet($data)
{
$api = 'cn.alibaba.open:app.expire.get';
return json_decode($this->requestApi($api, $data), true);
}
//处理数据
protected function handleSearchData(&$data){
if(!isset($data['categoryId']) && $data['keywords'] == ''){
$data['keywords'] = '零食';
}else if(isset($data['categoryId']) && $data['categoryId'] == '' && $data['keywords'] == ''){
$data['keywords'] = '零食';
}
//默认一键包邮
if(!isset($data['filterFreePostage'])){
$data['filterFreePostage'] = true;
}
//是否包邮,是否一键代发,是否七天无理由退款,是否48小时发货
$arr = ['filterFreePostage','filterYjdf','filter7dNoReasonReturn','filter48hShip'];
foreach($data as $key => $val){
if(in_array($key,$arr)){
$data[$key] = $data[$key] > 0 ? true : false;
}
}
return $data;
}
}

View File

@ -0,0 +1,594 @@
<?php
namespace addon\ali1688\model;
use app\model\BaseModel;
use think\facade\Cache;
use addon\ali1688\model\Config as ConfigModel;
class CloudApi extends BaseModel
{
public $appKey = '5551517';
public $appSecret = 'eIXulHBjO4UK';
public $gatewayHost = 'https://gw.open.1688.com/openapi/param2/1/';
public $site_id;
public $access_token;
public $config;
public $public = [];
public $agent_baseURL = 'https://1688.sopvip.com/agent';
public $redirect_uri = 'https://1688.sopvip.com/getAuth';
public $notify_status = 'https://1688.sopvip.com/notifyStatus';
public function __construct($site_id = 0)
{
$this->site_id = $site_id;
$this->public = [
'client_id' => $this->appKey,
'client_secret' => $this->appSecret,
];
if (request()->param('code') && request()->param('state')) {
$state = explode('|', base64_decode(request()->param('state')));
$this->site_id = $state[1];
$this->getAccessToken(request()->param('code'));
if (!cache(request()->param('code'))) {
cache(request()->param('code'), 1);
$this->getAccessToken(request()->param('code'));
} else {
$this->access_token = Cache::store('redis_public')->get($this->site_id . '1688access_token');
}
} else {
$this->refreshToken();
}
}
/***
* 获取授权码
* @param $_uri
* @param $redirect_uri
* @return string
*/
public function getAuthorization_codeurl($_uri = '', $redirect_uri = '')
{
$redirect = $_uri ?: addon_url('ali1688/shop/auth/index');
$codeData = [
'grant_type' => 'authorization_code',
'client_id' => $this->appKey,
'site' => 1688,
'state' => base64_encode($redirect . '|' . $this->site_id),
'redirect_uri' => $redirect_uri ?: $this->redirect_uri,
];
return 'https://auth.1688.com/oauth/authorize?' . http_build_query($codeData);
}
/***
* 查询是否免密支付
* @return void
*/
public function getTradeIsopenProtocolPay()
{
$api = 'com.alibaba.trade/alibaba.trade.pay.protocolPay.isopen';
$result = $this->requestApi($api, []);
$result = json_decode($result, true);
$data['ispayopen'] = false;
$data['signUrl'] = 'https://tradeconfig.1688.com/foundation/withhold_manage.htm';
if (isset($result['success'])) {
$paymentAgreements = $result['result']['paymentAgreements'];
foreach ($paymentAgreements as $item) {
$data['signUrl'] = $item['signUrl'];
if ($item['bindingStatus'] == 'true' && $item['signedStatus'] == 'true') {
$data['ispayopen'] = true;
} else {
$data['ispayopen'] = false;
continue;
}
}
}
return $data;
}
public function getAppBuyInfo()
{
// $api = 'cn.alibaba.open/alibaba.app.pieceorder.get';
$api = 'cn.alibaba.open/app.order.get';
// var_dump($this->config);die;
// var_dump(date('Y-m-d H:i:s',time());
// var_dump(date('YmdHis',time())+'000+0800');die;
$result = $this->requestApi($api, [
'gmtCreate' => json_encode([date('YmdHis', $this->config['create_time']) . '000+0800', date('YmdHis', time()) . '000+0800']),
// 'gmtCreate'=>$this->config['create_time']*1000,
// 'memberId'=>$this->config['value']['memberId']??'',
'aliId' => $this->config['value']['aliId'] ?? '',
'bizStatusList' => json_encode(['S', 'E', 'B'])
]);
// var_dump($this->config['value']['memberId'],$this->config['create_time'],$result);die;
$result = json_decode($result, true);
$data = [
'isbuyapp' => false,
'expire_time' => -1,
];
if (isset($result['returnValue'])) {
return $result['returnValue'];
}
return $data;
}
/***
* 地址解析
* @param $addressInfo
* @return mixed
* @throws \Exception
*/
public function getTradeAddresscodeParse($addressInfo = '')
{
$api = 'com.alibaba.trade/alibaba.trade.addresscode.parse';
$result = $this->requestApi($api, [
'addressInfo' => $addressInfo
]);
$result = json_decode($result, true);
return $result;
}
/***
* 创建订单预览
* @param $data
* @return mixed
* @throws \Exception
*/
public function createOrderPreview($data = [])
{
$api = 'com.alibaba.trade/alibaba.createOrder.preview';
$result = $this->requestApi($api, $data);
$result = json_decode($result, true);
return $result;
}
/****
* 创建订单
* @param $data
* @return mixed
* @throws \Exception
*/
public function fastCreateOrder($data = [])
{
$api = 'com.alibaba.trade/alibaba.trade.fastCreateOrder';
$result = $this->requestApi($api, $data);
$result = json_decode($result, true);
return $result;
}
/***
* 取消订单
* @param $orderID
* @return mixed
* @throws \Exception
*/
public function cancelOrder($tradeID, $cancelReason, $remark = '')
{
$api = 'com.alibaba.trade/alibaba.trade.cancel';
$result = $this->requestApi($api, ['webSite' => 1688, 'tradeID' => implode(',', $tradeID), 'cancelReason' => $cancelReason, 'remark' => $remark]);
$result = json_decode($result, true);
return $result;
}
/***
* 获取1688分类
* @param $categoryID
* @return mixed
* @throws \Exception
*/
public function getAlibabaCategory($categoryID = 0)
{
$Cache = Cache::get('1688categoryInfo' . $categoryID);
if ($Cache) {
return $Cache;
}
$api = 'com.alibaba.product/alibaba.category.get';
$result = $this->requestApi($api, ['categoryID' => $categoryID]);
$result = json_decode($result, true);
if (isset($result['categoryInfo'])) {
if ($categoryID == 0) {
Cache::set('1688categoryInfo' . $categoryID, $result['categoryInfo'][0]['childCategorys']);
return $result['categoryInfo'][0]['childCategorys'];
}
}
return $result;
}
public function getAlibabaProductFilter()
{
$Cache = Cache::get('1688productFilter');
if ($Cache) {
return $Cache;
}
$api = 'com.alibaba.fenxiao/jxhy.productFilter.get';
$result = $this->requestApi($api);
$result = json_decode($result, true);
if (isset($result['result']['result'])) {
$result = $result['result']['result'];
Cache::set('1688productFilter', $result);
return $result;
}
return [];
}
/***
* 获取授权令牌
* @param $code
* @return mixed
* @throws \Psr\SimpleCache\InvalidArgumentException
*/
public function getAccessToken($code = '')
{
$ConfigModel = new ConfigModel();
$config = (array)$ConfigModel->getConfig($this->site_id)['data']['value'];
if ($code == '' && isset($config['expire_tiem']) && intval($config['expire_tiem']) > time()) {
$this->access_token = $config['access_token'];
Cache::store('redis_public')->set($this->site_id . '1688access_token', $this->access_token, $config['expire_tiem'] - time());
return $this->access_token;
}
$url = "https://gw.open.1688.com/openapi/http/1/system.oauth2/getToken/{$this->appKey}";
$urlData = array_merge($this->public, [
'grant_type' => 'authorization_code',
'need_refresh_token' => true,
'client_id' => $this->appKey,
'client_secret' => $this->appSecret,
'code' => $code,
'redirect_uri' => addon_url('ali1688/shop/auth/info'),
]);
if ($this->agent_baseURL) {
$baseData = [
'baseURL' => $url,
'domain' => addon_url('ali1688/api/notify/index'),
'site_id' => $this->site_id,
'event' => 'AccessToken',
'data' => json_encode(array_merge($this->public, $urlData))
];
$result = $this->http_post_data($this->agent_baseURL, $baseData);
} else {
$result = http($url, 30, [], $urlData);
}
$json = json_decode($result, true);
if ($json && isset($json['access_token'])) {
$json['expire_tiem'] = time() + intval($json['expires_in']);
Cache::store('redis_public')->set($this->site_id . '1688access_token', $json['access_token'], intval($json['expires_in']) - 500);
$ConfigModel->setConfig(array_merge($config, $json), $this->site_id, 1);
$this->access_token = $json['access_token'];
} else {
return '';
}
return $this->access_token;
}
/***
* 重置TOKEN
* @return mixed|string
* @throws \Psr\SimpleCache\InvalidArgumentException
*/
public function refreshToken()
{
$ConfigModel = new ConfigModel();
$config = $ConfigModel->getConfig($this->site_id)['data']['value'];
$this->config = $ConfigModel->getConfig($this->site_id)['data'];
if (isset($config['expire_tiem']) && intval($config['expire_tiem']) > time()) {
$this->access_token = $config['access_token'];
Cache::store('redis_public')->set($this->site_id . '1688access_token', $this->access_token, $config['expire_tiem'] - time());
return $this->access_token;
}
$url = "https://gw.open.1688.com/openapi/param2/1/system.oauth2/getToken/{$this->appKey}";
$urlData = array_merge($this->public, [
'grant_type' => 'refresh_token',
'refresh_token' => $config['refresh_token'] ?? '',
'client_id' => $this->appKey,
'client_secret' => $this->appSecret,
]);
if ($this->agent_baseURL) {
$baseData = [
'baseURL' => $url,
'domain' => addon_url('ali1688/api/notify/index'),
'site_id' => $this->site_id,
'event' => 'AccessToken',
'data' => json_encode(array_merge($this->public, $urlData))
];
$result = $this->http_post_data($this->agent_baseURL, $baseData);
} else {
$result = http($url, 30, [], $urlData);
}
$json = json_decode($result, true);
if ($json && isset($json['access_token'])) {
$json['expire_tiem'] = time() + intval($json['expires_in']);
Cache::store('redis_public')->set($this->site_id . '1688access_token', $json['access_token'], intval($json['expires_in']) - 500);
$ConfigModel->setConfig(array_merge($config, $json), $this->site_id, 1);
$this->access_token = $json['access_token'];
} else {
return '';
}
return $this->access_token;
}
//获取商品详情
public function productInfoGet($data)
{
$api = 'com.alibaba.fenxiao/alibaba.fenxiao.productInfo.get';
return json_decode($this->requestApi($api, ['openOfferId' => $data['open_offer_id']]), true);
}
//添加分销店铺(买家)
public function buyerOutshopAdd()
{
$api = 'com.alibaba.fenxiao/alibaba.fenxiao.buyer.outshop.add';
return json_decode($this->requestApi($api, ['outShopCode' => $this->site_id, 'channel' => 'other']), true);
}
//添加分销商品关系(买家)
public function buyerOutproductRelationAdd()
{
$api = 'com.alibaba.fenxiao/alibaba.fenxiao.buyer.outproduct.relation.add';
$data = [
'channel' => 'other',
'outShopCode' => $this->site_id,
'outItemCode' => '6',
'openOfferId' => 'BgnuDNkhiXPv88gpE3sfbA==',
];
return json_decode($this->requestApi($api, $data), true);
}
/***
* 获取物流公司列表
* @return array|mixed
* @throws \Psr\SimpleCache\InvalidArgumentException
*/
public function getLogisticCompanyList()
{
$LogisticCompanyList = Cache::store('redis_public')->get('OpQueryLogisticCompanyList');
if ($LogisticCompanyList) {
return $LogisticCompanyList;
} else {
$api = 'com.alibaba.logistics/alibaba.logistics.OpQueryLogisticCompanyList.offline';
$res = json_decode($this->requestApi($api), true);
if (isset($res['result']) && $res['result']) {
$list = array_column($res['result'], null, 'companyNo');
Cache::store('redis_public')->set('OpQueryLogisticCompanyList', $list);
return $list;
}
return [];
}
}
//根据地址解析地区码
public function addressCodeParse($address)
{
$api = 'com.alibaba.trade/alibaba.trade.addresscode.parse';
return json_decode($this->requestApi($api, ['addressInfo' => $address]), true)['result'];
}
//查询订单可以支持的支付渠道
/***
* 查询支付渠道
* @param $orderId
* @return mixed
* @throws \Exception
*/
public function payWayQuery($orderId)
{
$api = 'com.alibaba.trade/alibaba.trade.payWay.query';
return json_decode($this->requestApi($api, ['orderId' => $orderId]), true);
}
/***
* 发起在线支付
* @param $orderIds
* @param $type PC或WIRELESS
* @return mixed
* @throws \Exception
*/
public function GroupPayUrl($orderIds, $type = 'PC')
{
$api = 'com.alibaba.trade/alibaba.trade.grouppay.url.get';
return json_decode($this->requestApi($api, ['orderIds' => $orderIds, 'payPlatformType' => $type]), true);
}
/***
* 发起免密支付
* @param $orderId
* @return mixed
* @throws \Exception
*/
public function protocolPayPreparePay($orderId)
{
$api = 'com.alibaba.trade/alibaba.trade.pay.protocolPay.preparePay';
return json_decode($this->requestApi($api, ['tradeWithholdPreparePayParam' =>json_encode(['orderId' => $orderId])]), true);
}
//获取交易订单的物流信息
public function getLogisticsInfos($orderId)
{
$api = 'com.alibaba.logistics/alibaba.trade.getLogisticsInfos.buyerView';
return json_decode($this->requestApi($api, ['orderId' => $orderId]), true);
}
//获取交易订单的物流跟踪信息
public function getLogisticsTraceInfo($orderId)
{
$api = 'com.alibaba.logistics/alibaba.trade.getLogisticsTraceInfo.buyerView';
return json_decode($this->requestApi($api, ['orderId' => $orderId, 'webSite' => '1688']), true);
}
//查询退款退货原因(用于创建退款退货)
public function getRefundReasonList($data)
{
$api = 'com.alibaba.trade/alibaba.trade.getRefundReasonList';
$array = [
'orderId' => $data['orderId'],
'orderEntryIds' => $data['orderEntryIds'],
'goodsStatus' => $data['goodsStatus'],
];
return json_decode($this->requestApi($api, $array), true);
}
//创建退款退货申请
public function createRefund($data)
{
$api = 'com.alibaba.trade/alibaba.trade.createRefund';
$array = [
'orderId' => $data['orderId'],
'orderEntryIds' => $data['orderEntryIds'],
'disputeRequest' => $data['disputeRequest'],
'applyPayment' => $data['applyPayment'],
'applyCarriage' => $data['applyCarriage'],
'applyReasonId' => $data['applyReasonId'],
'description' => $data['description'],
'goodsStatus' => $data['goodsStatus'],
];
return json_decode($this->requestApi($api, $array), true);
}
//上传退款退货凭证
public function uploadRefundVoucher($imageData)
{
$api = 'com.alibaba.trade/alibaba.trade.uploadRefundVoucher';
return json_decode($this->requestApi($api, ['imageData' => $imageData]), true);
}
//查询退款单列表(买家视角)
public function queryOrderRefundList($data)
{
$api = 'com.alibaba.trade/alibaba.trade.refund.buyer.queryOrderRefundList';
return json_decode($this->requestApi($api, $data), true);
}
//查询退款单详情-根据订单ID买家视角
public function OpQueryBatchRefundByOrderIdAndStatus($data)
{
$api = 'com.alibaba.trade/alibaba.trade.refund.OpQueryBatchRefundByOrderIdAndStatus';
return json_decode($this->requestApi($api, $data), true);
}
//查询退款单详情-根据退款单ID买家视角
public function OpQueryOrderRefund($data)
{
$api = 'com.alibaba.trade/alibaba.trade.refund.OpQueryOrderRefund';
return json_decode($this->requestApi($api, $data), true);
}
//退款单操作记录列表(买家视角)
public function OpQueryOrderRefundOperationList($data)
{
$api = 'com.alibaba.trade/alibaba.trade.refund.OpQueryOrderRefundOperationList';
return json_decode($this->requestApi($api, $data), true);
}
//买家提交退款货信息
public function refundReturnGoods($data)
{
$api = 'com.alibaba.trade:alibaba.trade.refund.returnGoods';
return json_decode($this->requestApi($api, $data), true);
}
//订购的订单列表
public function pieceorderGet($data)
{
$api = 'cn.alibaba.open/alibaba.app.pieceorder.get';
return json_decode($this->requestApi($api, $data), true);
}
//app 在服务市场被订购的订单列表
public function orderGet($data)
{
$api = 'cn.alibaba.open/app.order.get';
return json_decode($this->requestApi($api, $data), true);
}
//获取某个应用最近一个月的到期订单信息
public function expireGet($data)
{
$api = 'cn.alibaba.open/app.expire.get';
return json_decode($this->requestApi($api, $data), true);
}
/***
* 获取签名
* @param $path
* @param $postData
* @return string
*/
public function getSign($path, $postData)
{
$paramsToSign = array();
foreach ($postData as $k => $v) {
$paramToSign = $k . $v;
array_push($paramsToSign, $paramToSign);
}
sort($paramsToSign);
$implodeParams = implode($paramsToSign);
$pathAndParams = $path . $implodeParams;
$sign = hash_hmac("sha1", $pathAndParams, $this->appSecret, true);
$signHexWithLowcase = bin2hex($sign);
$signHexUppercase = strtoupper($signHexWithLowcase);
return $signHexUppercase;
}
/***
* 请求接口
* @param string $api
* @param $data
* @return array|bool|mixed|string
* @throws \Exception
*/
public function requestApi(string $api, $data = [], $extend = '')
{
$event = $api;
// 信息处理 获取请求签名
$api .= '/' . $this->appKey;
$timestamp = round(microtime(true) * 1000);
$data['_aop_timestamp'] = $timestamp;
$data['access_token'] = $this->access_token;
$data['_aop_signature'] = $this->getSign($api, $data);
// 发起请求
$link = $this->gatewayHost . $api;
if ($this->agent_baseURL) {
$bestdata = [
'domain' => config('domain.url') . '/ali1688/api/notify/index',
'site_id' => $this->site_id,
'event' => $event,
'baseURL' => $link,
'data' => json_encode(array_merge($this->public, $data))
];
return $this->http_post_data($this->agent_baseURL, $bestdata);
} else {
return http($link, 30, [], array_merge($this->public, $data));
}
}
public function http_post_data($url, $params = array())
{
if (is_array($params)) {
$params = http_build_query($params, null, '&');
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
}

View File

@ -0,0 +1,67 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\ali1688\model;
use app\model\system\Config as ConfigModel;
use app\model\BaseModel;
/**
* 微信小程序配置
*/
class Config extends BaseModel
{
/***
* 设置配置信息
* @param $data
* @param $is_use
* @param $site_id
* @return array
*/
public function setConfig($data, $site_id, $is_use = 1)
{
$config = new ConfigModel();
$res = $config->setConfig($data, '阿里1688系统设置', $is_use, [['site_id', '=', $site_id], ['app_module', '=', 'shop'], ['config_key', '=', 'ali1688']]);
return $res;
}
/**
* 获取配置信息
* @param int $site_id
* @return array
*/
public function getConfig($site_id)
{
$config = new ConfigModel();
$res = $config->getConfig([['site_id', '=', $site_id], ['app_module', '=', 'shop'], ['config_key', '=', 'ali1688']]);
return $res;
}
public function accessToken($site_id, $data = '')
{
$config = new ConfigModel();
if ($data) {
$res = $config->setConfig($data, '阿里1688accessToken', 1, [['site_id', '=', $site_id], ['app_module', '=', 'shop'], ['config_key', '=', '1688accessToken']]);
return $res;
}
$res = $config->getConfig([['site_id', '=', $site_id], ['app_module', '=', 'shop'], ['config_key', '=', '1688accessToken']]);
if (empty($res['data']['value'])) {
return '';
} else {
$data = $res['data']['value'];
if ($data['expire_tiem'] - time() >= 0) {
return $data['access_token'];
} else {
return '';
}
}
}
}

View File

@ -0,0 +1,738 @@
<?php
namespace addon\ali1688\model;
use app\model\BaseModel;
use app\model\goods\Goods as GoodsModel;
use app\model\NewBaseModel;
use app\model\system\Cron;
use app\model\upload\Album;
use think\Exception;
/**
* 1688供应链商品相关处理
* Class Goods
* @package addon\1688\model
*/
class Goods extends BaseModel
{
protected $site_id = 0;
protected $goods_spec_format = '';// 商品多规格 必须,否则多规格无效
protected $open_offer_id = 0;// 供应链商品ID
public function __construct($siteId)
{
$this->site_id = $siteId;
}
/**
* 取已入库的商品列表
* @param array $search
* @return mixed
*/
public function getGoodsList($condition, $page, $page_size, $field = 'w.*,g.goods_image,g.brand_name,g.market_price,g.price,g.cost_price,g.goods_stock,g.site_name', $order = 'w.create_time desc')
{
$join = [
['goods g', 'g.goods_id=w.goods_id', 'left']
];
$result = model('supply_goods_warehousing')->pageList($condition, $field, $order, $page, $page_size, 'w', $join);
return $this->success($result);
}
/***
* 添加产品
* @param $data
* @param $site_id
* @return array
*/
public function addGoods($goodsData, $site_id, $productID, $template_id = 0)
{
$follow = (new Choice($this->site_id))->followGoods($productID);
if ($follow == true) {
model('goods')->startTrans();
try {
$this->site_id = $site_id;
// 判断:当前商品是否已经入库
$isHas = (int)model("supply_goods_warehousing")->getValue([['open_offer_id', '=', $productID], ['site_id', '=', $this->site_id]], 'id');
if ($isHas) throw new Exception('当前商品已经存在,您可以直接编辑商品或者删除重新添加');
$goodsData['site_id'] = $site_id;
$goods_image = explode(',', $goodsData['goods_image']);
$goods_sku_data = json_decode($goodsData['goods_sku_data'], true);
$sku_image = array_column($goods_sku_data, 'sku_image');
$goods_images = array_unique(array_merge($goods_image, $sku_image));
$this->GooodsImgCheck($site_id, $goods_images);//验证图片上传
$res = (new GoodsModel())->addGoods($goodsData);
if ($res['data']) {
model('supply_goods_warehousing')->add([
'site_id' => $this->site_id,
'goods_id' => $res['data'],
'open_offer_id' => $productID,
'channel_type' => '1688',
'third_party_name' => '1688精选',
'template_id' => $template_id,
'goods_name' => $goodsData['goods_name'],
'create_time' => time(),
'update_time' => time(),
]);
model('goods')->commit();
return $this->success('入库成功');
}
throw new \Exception($res['message']);
} catch (\Exception $e) {
model('goods')->rollback();
return $this->error('', $e->getMessage());
}
} else {
return $this->error($follow);
}
}
/****
* 检查图片同步
* @param $goods_images
* @return void
*/
public function GooodsImgCheck($site_id, $goods_images)
{
$thumb_value = model('album_pic')->getColumn([['pic_path', 'in', $goods_images]], 'pic_path', 'pic_path');
$goods_images = array_diff($goods_images, $thumb_value);
if ($goods_images) {
$album_id = model('album')->getValue([['site_id', '=', $site_id], ['type', '=', 'img']], 'album_id');
$album_model = new Album();
$cron = new Cron();
foreach ($goods_images as $k => $v) {
$data = [
"pic_path" => $v,//图片云存储
"pic_name" => md5($v),
"pic_spec" => 'x',
"update_time" => time(),
"site_id" => $site_id,
"size" => 0,
"album_id" => $album_id,
"is_thumb" => 0,
];
$res = $album_model->addAlbumPic($data);
if ($res['code'] >= 0) {
$data["id"] = $res["data"];
$cron->addCron(1, 1, '图片同步上传', 'AlbumUpload', time(), $res["data"]);
}
}
}
return $this->success('成功');
}
/***
* 产品下架
* @param $goodsData
* @param $site_id
* @param $productID
* @return void
*/
public function GooodsDelisting($site_id, $productID, $isDel = 0)
{
$where = [
['site_id', '=', $site_id],
['open_offer_id', '=', $productID]
];
$goods_ids = model('supply_goods_warehousing')->getColumn($where, 'goods_id');
if ($goods_ids) {
$goods_model = new GoodsModel();
$data = [
'goods_state' => 0
];
if ($isDel) {
$data['is_delete'] = 1;
$goods_model->modifyIsDelete($goods_ids, 1, $site_id);
} else {
$goods_model->modifyGoodsState($goods_ids, 0, $site_id);
}
model('supply_goods_warehousing')->update($data, $where);
}
return $this->success('下架成功');
}
/**
* @param $info
* @param array $goodsDetail 供应链商品信息不存在则通过api接口获取
* @return array
*/
public function refreshGoodsInfo($info, $goodsDetail = [])
{
model('goods')->startTrans();
try {
$this->site_id = $info['site_id'] ?? $this->site_id;
$this->open_offer_id = $info['offer_id'] ?? 0;
// 判断:当前商品是否已经入库
$goodsId = (int)model("supply_goods_warehousing")->getValue([['open_offer_id', '=', $this->open_offer_id], ['site_id', '=', $this->site_id]], 'goods_id');
if ($goodsId <= 0) throw new Exception('商品不存在!');
// 获取入库商品详情
if (!$goodsDetail) $goodsDetail = (new Choice($this->site_id))->getGoodsDetail($this->open_offer_id);
$goodsData = $this->generateGoodsInfo($goodsDetail);
$goodsData['goods_id'] = $goodsId;
unset($goodsDetail['create_time']);
(new GoodsModel())->editGoods($goodsData);
// 添加入库记录
model('supply_goods_warehousing')->update([
'update_time' => time(),
], [
['goods_id', '=', $goodsId],
['site_id', '=', $this->site_id]
]);
model('goods')->commit();
return $this->success('刷新成功');
} catch (\Exception $e) {
model('goods')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
*商品入库 - 生成本平台商品信息
* @param $goodsDetail
* @return array
*/
public function generateGoodsInfo($goodsDetail, $template_id = 0, $saleType = 'normal')
{
$time = time();
$sku = [];
if (isset($goodsDetail['skuInfos'])) {
$sku = $goodsDetail['skuInfos'];// 商品规格列表
}
$fileList = $goodsDetail['image']['images'] ?? [];// 商品主图列表
$goods_info = model('supply_goods_warehousing')->getInfo(['open_offer_id' => $goodsDetail['productID']], 'w.goods_id,g.goods_name,g.brand_id,g.price,g.market_price,g.goods_name,g.price,g.goods_image,g.category_id,g.category_json', 'w', [['goods g', 'g.goods_id=w.goods_id', 'left']]);
$goods_category = [];
$category_id = '';
$categoryjson = '';
$brandId = '';
$goods_id = '';
$goods_name = $goodsDetail['subject'];
if ($goods_info) {
$categoryjson = $goods_info['category_json'];
$category_json = json_decode($categoryjson);
$category_id = $goods_info['category_id'];
$brandId = $goods_info['category_id'];
$goods_id = $goods_info['goods_id'];
$goods_name = $goods_info['goods_name'];
foreach ($category_json as $k => $v) {
if (!empty($v)) {
$category_list = model('goods_category')->getList([['category_id', 'in', $v]], 'category_name', 'level asc');
$category_name = array_column($category_list, 'category_name');
$category_name = implode('/', $category_name);
$goods_category[$k] = [
'id' => $v,
'category_name' => $category_name
];
}
}
$goods_category = $goods_category;
}
$price_template = [
'price_set' => [
'multiple' => 35,
'increase' => 0,
],
'title_set' => [],
'sku_set' => [],
];
if ($template_id) {
$template = model('supply_price_template')->getInfo(['id' => $template_id]);
if ($template) {
$price_template['price_set'] = json_decode($template['price_set'], true);
$price_template['title_set'] = json_decode($template['title_set'], true);
$price_template['sku_set'] = json_decode($template['sku_set'], true);
}
} else {
$template = model('supply_price_template')->getInfo(['site_id' => $this->site_id, 'is_default' => 1]);
if ($template) {
$price_template['price_set'] = json_decode($template['price_set'], true);
$price_template['title_set'] = json_decode($template['title_set'], true);
$price_template['sku_set'] = json_decode($template['sku_set'], true);
}
}
// 数据处理 - 库存
$saleInfo = $goodsDetail['saleInfo'];
$stock = $saleInfo['amountOnSale'];
$img_url = 'https://cbu01.alicdn.com/';
// 数据处理 - 主图列表
$goodsImage = implode(',', array_map(function ($data) use ($img_url) {
return $img_url . $data;
}, $fileList));
$default_img = explode(',', $goodsImage)[0];
$attributes = array_column($sku, 'attributes');
$_spec = [];
foreach ($attributes as $key => $val) {
foreach ($val as $k => $v) {
$attributeID = $v['attributeID'];
$skuImageUrl = $v['skuImageUrl'] ?? '';
$spec_value_name = $v['attributeValue'];
if (!isset($_spec[$attributeID])) {
$_spec[$attributeID] = [
'spec_id' => $attributeID,
'spec_name' => $v['attributeName'],
'value' => [$spec_value_name => [
'spec_id' => $attributeID,
'spec_name' => $v['attributeName'],
'spec_value_name' => $v['attributeValue'],
'spec_value_id' => $attributeID + $key,
'image' => $skuImageUrl ? $img_url . $skuImageUrl : ''
]]
];
} else {
$_spec[$attributeID]['value'][$spec_value_name] = [
'spec_id' => $attributeID,
'spec_name' => $v['attributeName'],
'spec_value_name' => $v['attributeValue'],
'spec_value_id' => $attributeID + $key,
'image' => $skuImageUrl ? $img_url . $skuImageUrl : ''
];
}
}
}
if (count($sku) > 0) {//多规格
$skuList = $this->generateGoodsSkuInfo($sku, $goods_id, $saleInfo, $price_template, $default_img, $img_url, $_spec, $goodsDetail['productID'], $saleType);
$one_sku = $sku[0];
if ($saleType == 'normal') {
$minOrderQuantity = 1;
$consignPrice = $one_sku['retailPrice'];
$is_free_shipping = 1;
} else {
$minOrderQuantity = $saleInfo['minOrderQuantity'];
$consignPrice = $one_sku['jxhyPfPrice'];
$is_free_shipping = 0;
}
} else { //单规格
if ($saleType == 'normal') {
$minOrderQuantity = 1;
$consignPrice = $saleInfo['retailprice'];
$is_free_shipping = 1;
} else {
$minOrderQuantity = $saleInfo['minOrderQuantity'];
$consignPrice = $saleInfo['jxhyPfPrice'];
$is_free_shipping = 0;
}
$startQuantity = array_column($goodsDetail['saleInfo']['priceRanges'], 'startQuantity');
$price = $saleInfo['priceRanges'][array_search(min($startQuantity), $startQuantity)]['price'] ?? $saleInfo['priceRanges'][0]['price'];
$image = $goodsDetail['image']['images'][0];
//单规格单独去拼装
$skuList = [$this->fictitiousGoodsSkuInfo($goods_id, $goods_name, $price, $consignPrice, $stock, $image, $img_url, $goodsDetail)];
$one_sku = [
'retailPrice' => $consignPrice,
'consignPrice' => $consignPrice,
'price' => $price
];
}
$_spec = array_map(function ($val) {
return [
'spec_id' => $val['spec_id'],
'spec_name' => $val['spec_name'],
'value' => array_values($val['value'])
];
}, $_spec);
if ($_spec) {
$this->goods_spec_format = json_encode(array_values($_spec), JSON_UNESCAPED_UNICODE);
}
$goods_attr_format = [];
if ($goodsDetail['attributes']) {
foreach ($goodsDetail['attributes'] as $key => $val) {
$goods_attr_format[] = [
'attr_class_id' => $key,
'attr_id' => $val['attributeID'],
'attr_name' => $val['attributeName'],
'attr_value_id' => $val['attributeID'],
'attr_value_name' => $val['value'],
'sort' => $key,
];
}
}
$goods_content = $goodsDetail['description'];//商品详情
$categoryjson = json_encode($category_id);//商品分类
$mul_inc_price = $price_template['price_set']['multiple'] ?? 0;
if ($mul_inc_price) {
$inc_price = ($consignPrice * $mul_inc_price / 100);
$inc_price = $inc_price < 0.01 ? 0.01 : $inc_price;
} else {
$inc_price = ($price_template['price_set']['increase'] ?: $consignPrice * 5 / 100);
$inc_price = $inc_price < 0.01 ? 0.01 : $inc_price;
}
$price = $consignPrice + $inc_price;
$title_set = $price_template['title_set'] ?? '';
if ($title_set) {
if (isset($title_set['delete_keywords']) && $title_set['delete_keywords']) {
$goods_name = str_replace($title_set['delete_keywords'], '', $goods_name);
}
$goods_name = $title_set['prefix'] . $goods_name . $title_set['suffix'];
}
// 生成商品数据
return [
'goods_id' => $goods_id,// 商品名称
'goods_name' => $goods_name,// 商品名称
'goods_class' => 1,// 【固定不变】商品种类1.实物商品2.虚拟商品3.卡券商品4.服务项目5.卡项商品
'goods_class_name' => '实物商品',// 【固定不变】商品种类
'goods_attr_class' => 0,// 【固定不变】商品类型id
'goods_attr_name' => '',// 【固定不变】商品类型名称
'site_id' => $this->site_id,// 店铺ID
'goods_image' => $goodsImage,// 商品主图路径 多图以英文逗号隔开
'introduction' => '',//描述
'sku_list' => $skuList,//描述
'goods_content' => $goodsDetail['description'] ?: $goods_content,// 商品详情
'goods_state' => $goodsDetail['status'] == 'published' ? 1 : 0,// 【固定不变】
'category_id' => $category_id,// 商品分类id,逗号隔开
'category_json' => $categoryjson,// 分类json字符串
'goods_category' => $goods_category,// 分类json字符串
'brand_id' => $brandId,// 商品品牌id
'brand_name' => $goodsDetail['brand'] ?? '',// 品牌名称
'price' => moneyFormat(round($price, 1)),// 商品价格取第一个sku 对应-建议零售价
'cost_price' => $one_sku['consignPrice'] ?? $one_sku['price'] ?? 0,// 成本价取第一个sku 对应-结算价
'goods_stock' => $stock,// 商品库存(总和)
'is_free_shipping' => $is_free_shipping,// 是否包邮
'goods_spec_format' => $this->goods_spec_format,//json_encode($this->goods_spec_format, JSON_UNESCAPED_UNICODE),// 多规格信息
'create_time' => $time,// 添加时间
'modify_time' => $time,// 修改时间
'support_trade_type' => 'express', // 【固定不变】支持的配送方式 仅 快递发货
'market_price' => moneyFormat(round($price + $price * 35 / 100, 1)),//划线价
'sale_num' => 0,
'virtual_sale' => $goodsDetail['bookedCount'] ?? 0,
'real_stock' => $stock,
'label_id' => '',
'timer_on' => 0,
'timer_off' => '',
'is_consume_discount' => 0,
'goods_stock_alarm' => 0,
'shipping_template' => 0,
'goods_attr_format' => json_encode($goods_attr_format, JSON_UNESCAPED_UNICODE),
'keywords' => '',
'unit' => $saleInfo['unit'],
'video_url' => $goodsDetail['mainVedio'] ?? '',
'sort' => 0,
'sale_show' => 0,
'stock_show' => 0,
'market_price_show' => 0,
'barrage_show' => 0,
'goods_service_ids' => '',
'sale_channel' => 'all',
'sale_store' => 'all',
'is_limit' => 0,
'limit_type' => 1,
'max_buy' => '',
'min_buy' => $minOrderQuantity,
'recommend_way' => 0,
'is_zmxx' => 0,
'is_unify_pirce' => 1,
'qr_id' => '',
'goods_sku_data' => json_encode($skuList, JSON_UNESCAPED_UNICODE),
];
}
/**
* Common: 商品入库 - 商品分类处理查询本平台分类ID如果不存在则添加
* @param $cate
* @return int[]|string[]
*/
private function getThisPlatformCateIds($cate)
{
$cateNames = array_column($cate, 'name');
$hasList = model('goods_category')->getColumn([
['category_name', 'in', $cateNames],
['site_id', '=', $this->site_id]
], 'category_name', 'category_id');
// 数量不对 缺少分类ID
if (count($hasList) < count($cate)) {
$createCateData = array_filter(array_map(function ($apiCate) use ($hasList) {
if (!in_array($apiCate['name'], $hasList)) {
return [
'site_id' => $this->site_id,
'category_name' => $apiCate['name'],
'image' => imgSeeLink($apiCate['iconPath'] ?? ''),
'level' => 1,
'commission_rate' => 0.0,
];
}
return [];
}, $cate));
model('goods_category')->addList($createCateData);
return $this->getThisPlatformCateIds($cate);
}
return array_keys($hasList);
}
/**
* Common: 商品入库 - 商品品牌处理查询本平台品牌ID如果不存在则添加
* @param $brandName
* @return int
*/
private function getThisPlatformBrandId($brandName = '')
{
$brandId = 0;
if (!empty($brandName)) {
$brandId = (int)model('goods_brand')->getValue([
['brand_name', 'in', $brandName],
['site_id', '=', $this->site_id]
], 'brand_id');
// 数量不对 缺少分类ID
if ($brandId <= 0) {
model('goods_brand')->add([
'brand_name' => $brandName,
'site_id' => $this->site_id,
'create_time' => time()
]);
return $this->getThisPlatformBrandId($brandName);
}
}
return $brandId;
}
//1688单规格拼装数据
private function fictitiousGoodsSkuInfo($goodsId, $goodsName, $price, $retailPrice, $amountOnSale, $image, $img_url, $goodsDetail = [], $saleType = '')
{
$offerId = $goodsDetail['productID'];
return [
'site_id' => $this->site_id,// 所属店铺id
'goods_id' => $goodsId,// 商品id
'sku_id' => '',// 商品id
'sku_name' => $goodsName,// 商品sku名称
'sku_no' => '',// 商品sku编码
'price' => round(moneyFormat($price), 1, PHP_ROUND_HALF_EVEN), // sku单价
'cost_price' => $retailPrice,//sku成本价
'stock' => $amountOnSale, // 商品sku库存
'sku_image' => $img_url . $image,
'sku_images' => $img_url . $image,
'goods_class' => 1,
'goods_class_name' => '实物商品',
'create_time' => time(),
'modify_time' => time(),
'goods_attr_class' => 0,
'is_default' => 0,
'spec_name' => '', //
'real_stock' => $amountOnSale, // 实物库存
'sku_spec_format' => '',
'goods_supplier_format' => json_encode([
'offerId' => $offerId,
'skuId' => '',
'spec_id' => '',
'saleType' => $saleType,
]),//第三方扩展数据,因为是单规格为空
// 必须内容
'market_price' => moneyFormat(round($price + $price * 35 / 100, 1)),
'discount_price' => moneyFormat(round($price, 1)), // sku单价
'weight' => 0,
'volume' => 0,
'sale_num' => 0,
'virtual_sale' => 0,
'fenxiao_price' => 0,
'stock_alarm' => '',
];
}
//获取批发价
private function getRetailPrice($saleInfo)
{
//获取最小起订量
$minOrderQuantity = $saleInfo['minOrderQuantity'];
$startQuantity_num = array_column($saleInfo['priceRanges'], 'startQuantity');
$num = array_search($minOrderQuantity, $startQuantity_num);
return $saleInfo['priceRanges'][$num]['price'] ?? $saleInfo['priceRanges'][0]['price'];
}
/**
* Common: 商品入库 - 生成本平台商品规格信息
* @param $goodsDetail
* @param $goodsId
* @return array|array[]
*/
private function generateGoodsSkuInfo($sku, $goodsId, $saleInfo, $price_template, $defaultSkuImage, $img_url, $_spec, $offerId, $saleType = '')
{
// 获取默认主图
// 处理规格信息 生成本平台规矩信息列表
$skuList = array_map(function ($skuItem) use ($goodsId, $saleInfo, $defaultSkuImage, $price_template, $img_url, $_spec, $offerId, $saleType) {
// if (!isset($skuItem['retailPrice'])) {
// var_dump(555);
// $skuItem['retailPrice'] = $skuItem['retailPrice'];
// // $skuItem['retailPrice'] = !isset($skuItem['price']) ? $skuItem['consignPrice'] : $skuItem['price'];
// }else if(!isset($skuItem['price'])){
// var_dump(666);
// $skuItem['price'] = $skuItem['retailPrice'];
// }
if ($saleType == 'normal') {
$consignPrice = $skuItem['retailPrice'];
} else {
$consignPrice = $skuItem['jxhyPfPrice'];
}
//进一位
// $retailPrice = ceil($skuItem['retailPrice'] * 10) / 10;
// if (!isset($skuItem['retailPrice'])) {
// $skuItem['retailPrice'] = $skuItem['consignPrice'];
// }
$mul_inc_price = $price_template['price_set']['multiple'] ?? 0;
if ($mul_inc_price) {
$inc_price = ($skuItem['retailPrice'] * $mul_inc_price / 100);
$inc_price = $inc_price < 0.01 ? 0.01 : $inc_price;
} else {
$inc_price = ($price_template['price_set']['increase'] ?: $skuItem['retailPrice'] * 5 / 100);
$inc_price = $inc_price < 0.01 ? 0.01 : $inc_price;
}
$sku_set = $price_template['sku_set'] ?? '';
$price = $consignPrice + $inc_price;
// $price = $skuItem['price'] + $inc_price;
// $saleType=$saleInfo['saleType']??'batch';
// if($saleType=='batch'){
// $price = $price / $saleInfo['minOrderQuantity'];
// $saleInfo['minOrderQuantity']=1;
// $skuItem['consignPrice']=$skuItem['consignPrice']/$saleInfo['minOrderQuantity'];
// }
$price = ceil($price * 10) / 10;
$attributes = $skuItem['attributes'];
$attributes = array_map(function ($item) use ($_spec) {
$spec_value_id = $_spec[$item['attributeID']]['value'][$item['attributeValue']]['spec_value_id'];
return [
'spec_id' => $item['attributeID'],
'spec_name' => $item['attributeName'],
'spec_value_id' => $spec_value_id,
'spec_value_name' => $item['attributeValue'],
'image' => '',
];
}, $attributes);
$sku_name = $skuItem['cargoNumber'];
if ($sku_set) {
if (isset($sku_set['delete_keywords']) && $sku_set['delete_keywords']) {
$sku_name = str_replace($sku_set['delete_keywords'], '', $sku_name);
}
$sku_name = $sku_set['prefix'] . $sku_name . $sku_set['suffix'];
}
// 规格列表
return [
'site_id' => $this->site_id,// 所属店铺id
'goods_id' => $goodsId,// 商品id
'sku_id' => '',// 商品id
'sku_name' => $sku_name,// 商品sku名称
'sku_no' => $skuItem['skuCode'],// 商品sku编码
// 'price' => round(moneyFormat($price), 1, PHP_ROUND_HALF_EVEN), // sku单价
// 'cost_price' => $skuItem['consignPrice'],//sku成本价
// 'cost_price' => !isset($skuItem['price']) ? $skuItem['consignPrice'] : $skuItem['price'],//sku成本价
'price' => $price, // sku单价
'cost_price' => $consignPrice,//sku成本价
'stock' => $skuItem['amountOnSale'], // 商品sku库存
'sku_image' => isset($skuItem['attributes'][0]['skuImageUrl']) ? $img_url . $skuItem['attributes'][0]['skuImageUrl'] : $defaultSkuImage,
'sku_images' => isset($skuItem['attributes'][0]['skuImageUrl']) ? $img_url . $skuItem['attributes'][0]['skuImageUrl'] : $defaultSkuImage,
'goods_class' => 1,
'goods_class_name' => '实物商品',
'create_time' => time(),
'modify_time' => time(),
'goods_attr_class' => 0,
'is_default' => 0,
'spec_name' => $skuItem['cargoNumber'] ?? '', //
'real_stock' => $skuItem['amountOnSale'], // 实物库存
'sku_spec_format' => json_encode($attributes),
'goods_supplier_format' => json_encode([
'offerId' => $offerId,
'skuId' => $skuItem['skuId'],
'spec_id' => $skuItem['specId'],
'saleType' => $saleType,
]),
// 必须内容
'market_price' => moneyFormat(round($price + $price * 35 / 100, 1)),
'discount_price' => moneyFormat(round($price, 1)), // sku单价
'weight' => 0,
'volume' => 0,
'sale_num' => 0,
'virtual_sale' => 0,
'fenxiao_price' => 0,
'stock_alarm' => '',
];
}, $sku);
if ($goodsId) {
$goods_model = new GoodsModel();
$goods_sku_list = $goods_model->getGoodsSkuList([['goods_id', '=', $goodsId], ['site_id', '=', $this->site_id]], "sku_id,sku_name,sku_no,sku_spec_format,price,market_price,cost_price,stock,weight,volume,sku_image,sku_images,goods_spec_format,spec_name,stock_alarm,is_default,goods_supplier_format", '')['data'];
$mpsku_arr = array_column($skuList, null, 'sku_no');
foreach ($goods_sku_list as $key => &$skuItem) {
if (isset($mpsku_arr[$skuItem['sku_no']])) {
$skuItem = array_merge($skuItem, $mpsku_arr[$skuItem['sku_no']]);
}
}
return $goods_sku_list;
}
return $skuList ?? [];
}
/**
* Common: 商品入库 - 刷新规格信息
* Author: wu-hui
* Time: 2023/09/04 11:27
* @param $skuList
* @param $goodsId
* @throws \Exception
*/
private function refreshGoodsSkuInfo($skuList, $goodsId)
{
// 获取已经存在的规格
$hasList = (array)model('goods_sku')->getColumn([
['goods_id', '=', $goodsId],
['site_id', '=', $this->site_id]
], 'sku_no', 'sku_id');
$skuIds = array_flip($hasList);// 键值互换 以sku编码为键 id为值
// 循环处理
$insertData = array_column($skuList, null, 'sku_no');// 默认添加全部
$updateData = [];
$deleteData = $skuIds;// 默认删除全部
foreach ($skuList as $skuItem) {
// 判断:如果当前规格已经存在,执行刷新 并且移除删除和添加内容
if (in_array($skuItem['sku_no'], $hasList)) {
$skuItem['sku_id'] = $skuIds[$skuItem['sku_no']];
$updateData[] = $skuItem;
unset($deleteData[$skuItem['sku_no']]);
unset($insertData[$skuItem['sku_no']]);
}
}
// 进行对应的操作 先删除、在修改、最后添加
model('goods_sku')->delete([
['goods_id', '=', $goodsId],
['sku_no', 'in', array_values($deleteData)],
['site_id', '=', $this->site_id]
]);
// 修改
$goodsSkuModel = (new NewBaseModel(['table_name' => 'goods_sku', 'pk' => 'sku_id']));
$goodsSkuModel->saveAll($updateData);
// 添加
model('goods_sku')->addList(array_values($insertData));
}
public function getDefaultSkuImage()
{
$url = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http";
$url .= "://" . $_SERVER['SERVER_NAME'] . '/public/static/img/default_img/square.png';
return $url;
}
/***
* 系统自动入库
* @return void
*/
public function AutoAddGoods($siteId = '')
{
return $this->success();
}
/***
* 删除供应链商品
* @param $params
* @return array
*/
public function deleteRecycleGoods($params)
{
$info = model('supply_goods_warehousing')->getList([['site_id', '=', $params['site_id']], ['goods_id', 'in', $params['goods_ids']]], 'goods_id,open_offer_id');
if ($info) {
$follow = (new Choice($this->site_id));
foreach ($info as $k => $v) {
$follow->unfollowGoods($v['open_offer_id']); //解除关注
}
}
model('supply_goods_warehousing')->delete([['site_id', '=', $params['site_id']], ['goods_id', 'in', $params['goods_ids']]]);
return $this->success('删除成功');
}
}

View File

@ -0,0 +1,332 @@
<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\ali1688\model;
use addon\ali1688\model\Config as ConfigModel;
use app\model\BaseModel;
use app\model\system\Cron;
class NotifyChange extends BaseModel
{
public $site_id;
public function Notify($data)
{
if (isset($data['message']) && isset($data['site_id'])) {
$ConfigModel = new ConfigModel();
$this->site_id = $data['site_id'];
$config = $ConfigModel->getConfig($data['site_id'])['data']['value'];
$msg = json_decode($data['message'], true);
file_put_contents($msg['type'] ?? '1688' . '.txt', json_encode($data));
if (!empty($config) && isset($msg['userInfo']) && isset($config['memberId']) && $config['memberId'] == $msg['userInfo']) {
switch ($msg['type']) {
//以下功能已完成
case 'LOGISTICS_BUYER_VIEW_TRACE': //物流变更
$res = $this->LOGISTICS_BUYER_VIEW_TRACE($msg);
break;
case 'ORDER_BUYER_VIEW_ORDER_SELLER_MODIFY_ADRESS': //商家修改订单地址(买家视角)
$res = $this->ORDER_BUYER_VIEW_ORDER_SELLER_MODIFY_ADRESS($msg);
break;
case 'ORDER_BUYER_VIEW_PART_PART_SENDGOODS': //1688订单部分发货
$res = $this->ORDER_BUYER_VIEW_ANNOUNCE_SENDGOODS($msg, 2);
break;
case 'ORDER_BUYER_VIEW_ANNOUNCE_SENDGOODS': //商品发货
$res = $this->ORDER_BUYER_VIEW_ANNOUNCE_SENDGOODS($msg);
break;
case 'ORDER_BUYER_VIEW_BUYER_MAKE': //订单创建成功
$res = $this->ORDER_BUYER_VIEW_BUYER_MAKE($msg);
break;
case 'ORDER_BATCH_PAY': //批量支付状态
$res = $this->ORDER_BATCH_PAY($msg);
break;
case 'ORDER_BUYER_VIEW_ORDER_PAY': //1688交易付款买家视角
$res = $this->ORDER_BUYER_VIEW_ORDER_PAY($msg);
break;
case 'ORDER_BUYER_VIEW_ORDER_SUCCESS': //交易成功
$res = $this->ORDER_BUYER_VIEW_ORDER_SUCCESS($msg);
break;
case 'ORDER_BUYER_VIEW_ORDER_SELLER_CLOSE': //1688订单关闭
$res = $this->ORDER_BUYER_VIEW_ORDER_SELLER_CLOSE($msg);
break;
case 'PRODUCT_RELATION_VIEW_PRODUCT_DELETE': //1688产品删除关系用户视角
case 'PRODUCT_RELATION_VIEW_PRODUCT_AUDIT': //1688产品审核下架关系用户视角
case 'PRODUCT_RELATION_VIEW_PRODUCT_EXPIRE': //1688产品下架关系用户视角
case 'PRODUCT_PFT_OFFER_QUIT': //商品下架
$res = $this->PRODUCT_PFT_OFFER_QUIT($msg);
break;
//未开发不重要
case 'LOGISTICS_MAIL_NO_CHANGE': //快递号修改
$res = $this->LOGISTICS_MAIL_NO_CHANGE($msg);
break;
case 'ORDER_BUYER_VIEW_ORDER_BUYER_REFUND_IN_SALES': //1688订单售中退款买家视角
case 'ORDER_BUYER_VIEW_ORDER_REFUND_AFTER_SALES': //1688订单售后退款买家视角
$res = $this->ORDER_BUYER_VIEW_ORDER_REFUND($msg);
break;
case 'PRODUCT_PFT_OFFER_PRICE_MODIFY': //精选货源商品价格变动消息
case 'PRODUCT_PRODUCT_INVENTORY_CHANGE': //1688商品库存变更消息
case 'PRODUCT_RELATION_VIEW_PRODUCT_CHANGE': //商品变更消息(关系用户视角、包含所有商品变更动作)
case 'PRODUCT_RELATION_VIEW_PRODUCT_REPOST': //1688产品上架关系用户视角
case 'PRODUCT_RELATION_VIEW_PRODUCT_NEW_OR_MODIFY': //1688产品新增或修改关系用户视角
$res = $this->PRODUCT_PFT_OFFER_PRICE_MODIFY($msg);
break;
case 'ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY': //1688修改订单价格
$res = $this->ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY($msg);
break;
default:
$res = 'ok';
break;
}
}
} else {
$res = 'ok';
}
echo $res;
}
/****
* 商品下架
* @param $msg
* @return void
*/
public function PRODUCT_PFT_OFFER_QUIT($msg)
{
$goodsModel = new Goods($this->site_id);
$isDel = 0;
if ($msg['type'] == 'PRODUCT_PFT_OFFER_QUIT') {//产品下架
$offerId = $msg['data']['offerId'];
} else if ($msg['type'] == 'PRODUCT_RELATION_VIEW_PRODUCT_EXPIRE') {//1688产品下架关系用户视角
$offerId = $msg['data']['productIds'];
} else if ($msg['type'] == 'PRODUCT_RELATION_VIEW_PRODUCT_DELETE') {//产品删除
$isDel = 1;
$offerId = $msg['data']['productIds'];
} else if ($msg['type'] == 'PRODUCT_RELATION_VIEW_PRODUCT_AUDIT') {//产品下架
$offerId = $msg['data']['productIds'];
}
$goodsModel->GooodsDelisting($this->site_id, $offerId, $isDel);
return 'ok';
}
/***
* 商品信息变动
* @param $msg
* @return string
*/
public function PRODUCT_PFT_OFFER_PRICE_MODIFY($msg)
{
return 'ok';
}
/***
* 物流变更
* @param $msg
* @return string
*/
public function LOGISTICS_BUYER_VIEW_TRACE($msg)
{
$logistics = $msg['data']['OrderLogisticsTracingModel'] ?? '';
if ($logistics) {
$goodsModel = new Order($this->site_id);
if ($logistics['statusChanged'] == 'CONSIGN') {//订单发货
$goodsModel->SendDelivery($logistics, $this->site_id, 'CONSIGN');
} else if ($logistics['statusChanged'] == 'SIGN') { //订单签收
}
}
return 'ok';
}
/***
* 快递号修改
* @param $msg
* @return string
*/
public function LOGISTICS_MAIL_NO_CHANGE($msg)
{
return 'ok';
}
/**
* 批量支付状态
* @param $msg
* @return string
*/
public function ORDER_BATCH_PAY($msg)
{
$batchPay = $msg['data']['batchPay'] ?? [];
$goodsModel = new Order($this->site_id);
foreach ($batchPay as $key => $value) {
if ($value['status'] == 'successed') {
$where = [
'third_order' => $value['orderId'],
'channel_type' => 1688,
];
$data = [
'pay_status' => 1,
'pay_time' => time(),
];
$goodsModel->updateOrderState($where, $data, $this->site_id);
}
}
return 'ok';
}
/***
* 商品发货
* @param $msg
* @return string
* @throws \Exception
*/
public function ORDER_BUYER_VIEW_ANNOUNCE_SENDGOODS($msg, $order_status = 1)
{
$goodsModel = new Order($this->site_id);
$third_order = $msg['data']['orderId'] ?? 0;
if ($third_order) {
$where = [
'third_order' => $third_order,
'channel_type' => 1688,
];
$data = [
'order_status' => $order_status,
];
$goodsModel->updateOrderState($where, $data, $this->site_id);
}
return 'ok';
}
/***
* 下单成功
* @param $msg
* @return string
* @throws \Exception
*/
public function ORDER_BUYER_VIEW_BUYER_MAKE($msg)
{
$goodsModel = new Order($this->site_id);
$third_order = $msg['data']['orderId'] ?? 0;
if ($third_order) {
$where = [
'third_order' => $third_order,
'channel_type' => 1688,
];
$data = [
'status' => 1,
];
$goodsModel->updateOrderState($where, $data, $this->site_id);
}
return 'ok';
}
/***
* 订单付款
* @param $msg
* @return string
*/
public function ORDER_BUYER_VIEW_ORDER_PAY($msg)
{
$goodsModel = new Order($this->site_id);
$third_order = $msg['data']['orderId'] ?? 0;
if ($third_order) {
$where = [
'third_order' => $third_order,
'channel_type' => 1688,
];
$data = [
'three_pay_status' => 1,
'pay_time' => time(),
];
$goodsModel->updateOrderState($where, $data, $this->site_id);
}
return 'ok';
}
/***
* 订单价格修改
* @param $msg
* @return string
*/
public function ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY($msg)
{
return 'ok';
}
/***
* 交易订单关闭
* @param $msg
* @return string
*/
public function ORDER_BUYER_VIEW_ORDER_SELLER_CLOSE($msg)
{
$goodsModel = new Order($this->site_id);
$third_order = $msg['data']['orderId'] ?? 0;
if ($third_order) {
$where = [
'third_order' => $third_order,
'channel_type' => 1688,
];
$data = [
'order_status' => -1,
];
$goodsModel->updateOrderState($where, $data, $this->site_id);
$cron_model = new Cron();
$order_id = model('supply_order')->getValue($where, 'order_id');
$cron_model->addCron(1, 0, '订单自动关闭', 'CronOrderClose', time(), $order_id);
}
return 'ok';
}
/***
* 商家修改订单地址
* @param $msg
* @return string
*/
public function ORDER_BUYER_VIEW_ORDER_SELLER_MODIFY_ADRESS($msg)
{
return 'ok';
}
/***
* 交易成功
* @param $msg
* @return string
*/
public function ORDER_BUYER_VIEW_ORDER_SUCCESS($msg)
{
$goodsModel = new Order($this->site_id);
$third_order = $msg['data']['orderId'] ?? 0;
if ($third_order) {
$where = [
'third_order' => $third_order,
'channel_type' => 1688,
];
$data = [
'order_status' => 10,
];
$goodsModel->updateOrderState($where, $data, $this->site_id);
}
return 'ok';
}
/***
* 交易退款售后
* @param $msg
* @return string
*/
public function ORDER_BUYER_VIEW_ORDER_REFUND($msg)
{
return 'ok';
}
}

View File

@ -0,0 +1,706 @@
<?php
namespace addon\ali1688\model;
use addon\ali1688\model\Config as ConfigModel;
use app\model\express\ExpressCompany;
use app\model\express\ExpressCompanyTemplate;
use app\model\NewBaseModel;
use app\model\order\Order as OrderModel;
use app\model\system\Cron;
use think\Exception;
use think\facade\Cache;
use think\facade\Log;
use app\model\BaseModel;
class Order extends BaseModel
{
public $site_id = 0;
public $config = [];
public $orderInfo = '';
public $quantity_temp = [];
public $skuList = [];
public function __construct($site_id = 0)
{
$this->site_id = $site_id;
}
/***
* 发起免密支付
* @param $site_id
* @param $id
* @return array
* @throws \Exception
*/
public function noPasswordPay($site_id, $id)
{
$result = model('supply_order')->getInfo(['order_id' => $id]);
if ($result['three_pay_status'] == 0 && $result['status'] == 1) {
$cloudApi = new CloudApi($site_id);
$res = $cloudApi->protocolPayPreparePay($result['third_order']);
if ($res['success']) {
$data = ['three_pay_status' => 1];
model('supply_order')->update($data, ['order_id' => $id]);
return $this->success('', '支付成功');
} else {
$code = [
'USER_BALANCE_NOT_ENOUGH' => '用户余额不足'
];
return $this->error(-1, $code[$res['code']] ?? '发生未知错误');
}
} else {
return $this->error(-1, '该订单已支付,或未下单!');
}
}
/***
* 获取在线支付链接
* @param $site_id
* @param $id
* @return array|void
*/
public function onlinePay($site_id, $id)
{
$result = model('supply_order')->getInfo(['order_id' => $id]);
if ($result['three_pay_status'] == 0 && $result['status'] == 1) {
$cloudApi = new CloudApi($site_id);
$order_ids = [$result['third_order']];
$res = $cloudApi->GroupPayUrl(json_encode($order_ids));
if ($res['success']) {
$res['order_money'] = $result['result_total_pay'];
return $this->success($res);
} else {
return $this->error(-1, $res['message']);
}
} else {
return $this->error(-1, '该订单已支付,或未下单!');
}
}
/***
* 取消订单
* @param $site_id
* @param $id
* @return array
* @throws \Exception
*/
public function cancelOrder($site_id, $id, $cancelReason)
{
$result = model('supply_order')->getInfo(['order_id' => $id]);
if ($result['three_pay_status'] == 0 && $result['status'] == 1) {
$cloudApi = new CloudApi($site_id);
$order_ids = [$result['third_order']];
$res = $cloudApi->cancelOrder($order_ids, $cancelReason);
if ($res['success']) {
$data = ['reason_failure' => $cancelReason, 'remark' => $cancelReason, 'order_status' => -1];
model('supply_order')->update($data, ['order_id' => $id]);
return $this->success('', '取消成功');
} else {
return $this->error(-1, $res['errorMessage']);
}
} else {
return $this->error(-1, '该订单已支付,或未下单!');
}
}
/***
* 创建订单浏览
* @param $order_no
* @return void
*/
public function createOrderPpreview($orderId = 0)
{
try {
// 获取订单商品信息
if ($orderId <= 0) throw new Exception("订单或者门店不存在!");
$goodsData = $this->getOrderArrangeInfo($orderId);
if (empty($goodsData)) throw new Exception("当前信息不存在!");
$cloudApi = new CloudApi($this->site_id);
$buyOrderInfo = $cloudApi->createOrderPreview($goodsData);
if (isset($buyOrderInfo['orderPreviewResuslt'])) {
$totalPay = 0;
$sumCarriage = 0;
$cargoList = []; //待整改与实时下单有冲突
foreach ($buyOrderInfo['orderPreviewResuslt'] as $k => $v) {
$totalPay += $v['sumPayment'];
$sumCarriage += $v['sumCarriage'];
$cargoList = array_merge($cargoList, $v['cargoList']);
}
$orderRecordUpdateData['cost_price'] = $totalPay / 100;
$orderRecordUpdateData['result_express_fee'] = $sumCarriage / 100;// 快递费
$orderRecordUpdateData['result_total_pay'] = $totalPay / 100;// 支付金额,包含快递费
$orderRecordUpdateData['status'] = 1;// 下单成功
$orderRecordUpdateData['result_id'] = 0;
$orderRecordUpdateData['result_user_id'] = 0;
$orderRecordUpdateData['result_status'] = 1;// 订单状态 1:待支付 2:支付完成
$orderRecordUpdateData['order_sub_list'] = $cargoList;// 子订单列表
$result = $this->success();
} else {
throw new Exception($buyOrderInfo['error_message'] ?? '未知错误');
}
} catch (\Exception $e) {
$message = $e->getMessage();
$orderRecordUpdateData['result_id'] = $buyOrderInfo['request_id'] ?? '';
$orderRecordUpdateData['status'] = 0;
$orderRecordUpdateData['reason_failure'] = $message;
$result = [
'code' => -2,
'msg' => $message,
];
}
// 修改下单记录信息
$this->updateOrderInfo($orderRecordUpdateData, $orderId);
return $result;
}
/***
* 获取订单信息
* @param $order_id
* @param $field
* @return mixed
*/
public function getOrderInfo($order_id, $field = '*')
{
$result = model('supply_order')->getInfo(['order_id' => $order_id], $field);
return $result;
}
/**
* 获取供应链订单列表
* @param $search
* @return array
*/
public function getOrderList($search)
{
// 查询条件
$where = [
['site_id', '=', $search['site_id']]
];
if (!empty($search['order_no'])) $where[] = ['order_no', '=', $search['order_no']];
if (!empty($search['result_id'])) $where[] = ['result_id', '=', $search['result_id']];
if (strlen($search['status'] ?? '') > 0) $where[] = ['status', '=', $search['status']];
// 其他查询配置
$result = model('supply_order')->pageList($where, '*', 'order_id DESC', $search['page'] ?? 1);
// 基本信息处理
return $this->success($result ?? []);
}
/***
* 获取订单子订单列表
* @param $site_id
* @param $order_id
* @return array
*/
public function getSubOrder($site_id, $order_id, $search = [])
{
$where = [
['sup.order_id', '=', $order_id],
['sup.site_id', '=', $site_id],
];
$join = [
[
'order_goods og',
'sup.order_id = og.order_id',
'inner'
]
];
$field = [
'og.order_goods_id',
'og.sku_name',
'og.sku_image',
'og.sku_no',
'og.cost_price',
'sup.id',
'sup.order_id',
'sup.result_id',
'sup.result_express_company',
'sup.result_express_number',
'sup.result_express_status',
'sup.result_express_time',
'sup.result_product_specs_id',
'sup.result_quantity',
'sup.result_seller_remarks',
];
// 获取订单商品信息
$result = model('supply_sub_order')->pageList($where, $field, 'id DESC', $search['page'] ?? 1, $search['page_size'] ?? 1, 'sup', $join);
return $this->success($result ?? []);
}
/***
* 获取供应链信息
* @param $orderId
* @param $field
* @return mixed
*/
public function getOrderSupplyGoods($orderId, $field = ['og.order_goods_id', 'og.sku_id', 'og.num', 'og.goods_id', 'o.buyer_message'])
{
$where = [
['og.order_id', '=', $orderId],
['fg.goods_id', '>', 0]
];
$join = [
[
'supply_goods_warehousing fg',
'og.goods_id = fg.goods_id',
'right'
],
[
'order o',
'o.order_id=og.order_id',
'inner'
]
];
$goods_order_sku = model('order_goods')->getList($where, $field, '', 'og', $join);
// 获取订单商品信息
return $goods_order_sku;
}
/**
* 下单记录 - 创建初始化下单记录
* @param $order
* @throws Exception
*/
public function orderPay($order)
{
$orderId = (int)$order['order_id'] ?? 0;
$this->site_id = (int)$order['site_id'] ?? 0;
if ($orderId <= 0 || $this->site_id <= 0) return $this->error('订单或者店铺不存在!');
// 获取订单商品信息 仅获取供应链的商品
$orderGoodsList = $this->getOrderSupplyGoods($orderId);
if (count($orderGoodsList)) {
// 记录当前订单信息
$res = $this->updateOrderState(['site_id' => $this->site_id, 'order_id' => $orderId],
[
'order_no' => $order['order_no'],
'buyer_shop_id' => $order['site_id'],
'order_name' => $order['order_name'],
'order_from' => $order['order_from'],
'pay_status' => 1,
'buyer_uid' => $order['member_id'],
'name' => $order['name'],
'mobile' => $order['mobile'] ?: $order['telephone'],
'province_id' => $order['province_id'],
'city_id' => $order['city_id'],
'district_id' => $order['district_id'],
'address' => $order['address'],
'buyer_message' => $order['buyer_message'],
'full_address' => $order['full_address'],
'goods_num' => $order['goods_num'],
'pay_money' => $order['pay_money'],
'pay_time' => $order['pay_time']
],
$this->site_id
);
$ConfigModel = new ConfigModel();
$config = $ConfigModel->getConfig($this->site_id)['data']['value'];
$isAutoBuyOrder = $config['isAutoBuyOrder'] ?? 0;
if ($isAutoBuyOrder == 1) {
$cron = new Cron();
$cron->addCron(1, 1, '1688自动下单', 'CronAutoAliOrderBuy', time(), $orderId);
}
}
}
/**
* Common: 下单记录 - 创建初始化下单记录
* @param $order
* @throws Exception
*/
public function orderCreate($order)
{
$orderId = (int)$order['order_id'] ?? 0;
$this->site_id = (int)$order['site_id'] ?? 0;
if ($orderId <= 0 || $this->site_id <= 0) return $this->error('订单或者店铺不存在!');
if (isset($order['create_data']['shop_goods_list']['goods_list'])) {
$goods_ids = array_column($order['create_data']['shop_goods_list']['goods_list'], 'goods_id');
if (model('supply_goods_warehousing')->getCount([['goods_id', 'in', $goods_ids]], 'id') > 0) {
$data = [
'site_id' => $order['site_id'],
'order_id' => $order['order_id'],
'order_no' => $order['order_no'] ?? '',
'order_from' => $order['create_data']['order_from'] ?? '',//订单来源
'order_from_name' => $order['create_data']['order_from_name'] ?? '',//来源名称
'channel_type' => '1688',
'status' => -1,// 订单状态:-1=待请求下单0=下单失败1=下单成功
'pay_status' => 0,// 是否扣款
'create_time' => time(),
'goods_money' => $order['create_data']['goods_money'],
'delivery_money' => $order['create_data']['delivery_money'],
'invoice_money' => $order['create_data']['invoice_money'],
'order_money' => $order['create_data']['order_money'],
'adjust_money' => $order['create_data']['adjust_money'],
'balance_money' => $order['create_data']['balance_money'],
'pay_money' => $order['create_data']['pay_money'],
];
$this->createRecordAdd($data);
}
}
}
/***
* 订单状态更新
* @param $condition
* @param $data
* @param $site_id
* @return int
*/
public function updateOrderState($condition, $data, $site_id = 0)
{
$res = model('supply_order')->update($data, $condition);
return $res;
}
/**
* 下单记录 - 记录下单日志
* @param $data
*/
private function createRecordAdd($data)
{
$isHas = (int)model('supply_order')->getValue([
['order_id', '=', $data['order_id']]
], 'order_id');
if ($isHas <= 0) {
model('supply_order')->add($data);
}
}
/**
* 下单-自动请求供应链下单
* @param $siteId
*/
public function authBuyOrder($order_id = 0)
{
// 获取最早的、未进行下单请求的订单id
// 存在id 进行自动下单操作
if ($order_id > 0) {
return $this->orderCreateRequest($order_id);
} else {
return $this->error('1688订单号不存在');
}
}
/**
* 下单 - 请求进行下单操作
* @param $order
*/
public function orderCreateRequest($orderId = 0)
{
try {
// 获取订单商品信息
if ($orderId <= 0) return $this->error(-1, '订单或者门店不存在!');
$goodsData = $this->getOrderArrangeInfo($orderId);
if (empty($goodsData)) return $this->error(-1, '当前信息不存在');
$cloudApi = new CloudApi($this->site_id);
$buyOrderInfo = $cloudApi->fastCreateOrder($goodsData);
if (isset($buyOrderInfo['result']['totalSuccessAmount'])) {
$result = $buyOrderInfo['result'];
$cargoList = json_decode($goodsData['cargoParamList'], true);
$cargoList = array_column($cargoList, null, 'specId');
foreach ($this->skuList as $k => $v) {
$offer = json_decode($v['goods_supplier_format'], true);
$cargoList[$offer['spec_id']]['cost_price'] = $v['cost_price'];
$cargoList[$offer['spec_id']]['sku_id'] = $v['sku_id'];
$cargoList[$offer['spec_id']]['sku_no'] = $v['sku_no'];
$cargoList[$offer['spec_id']]['goods_id'] = $v['goods_id'];
$cargoList[$offer['spec_id']]['third_order'] = $result['orderId'];
}
$totalPay = $result['totalSuccessAmount'] ?? 0;
$sumCarriage = $result['postFee'];
$orderRecordUpdateData['third_order'] = $result['orderId'];
$orderRecordUpdateData['cost_price'] = $totalPay / 100;
$orderRecordUpdateData['result_express_fee'] = $sumCarriage / 100;// 快递费
$orderRecordUpdateData['result_total_pay'] = $totalPay / 100;// 支付金额,包含快递费
$orderRecordUpdateData['status'] = 1;// 下单成功
$orderRecordUpdateData['result_id'] = 0;
$orderRecordUpdateData['result_user_id'] = 0;
$orderRecordUpdateData['result_status'] = 1;// 订单状态 1:待支付 2:支付完成
$orderRecordUpdateData['order_sub_list'] = array_values($cargoList);// 子订单列表
$this->updateOrderInfo($orderRecordUpdateData, $orderId);
if (isset($result['failedOfferList'])) {
foreach ($result['failedOfferList'] as $k => $v) {
model('supply_sub_order')->update(['result_express_status' => -1, 'result_exception_reason' => $v['errorMessage']], ['result_product_specs_id' => $v['specId']]);
}
}
$result = $this->success('下单成功');
} else {
return $this->error('发生错误', $buyOrderInfo['message'] ?? '未知错误');
}
} catch (\Exception $e) {
$message = $e->getMessage();
$orderRecordUpdateData['result_id'] = $buyOrderInfo['request_id'] ?? '';
$orderRecordUpdateData['status'] = 0;
$orderRecordUpdateData['reason_failure'] = $message;
$result = [
'code' => -2,
'msg' => $message,
];
$this->updateOrderInfo($orderRecordUpdateData, $orderId);
}
// 修改下单记录信息
return $result;
}
/**
* Common: 订单处理 - 供应链订单信息修改
* @param $orderRecordUpdateData
* @param $orderId
* @throws \Exception
*/
public function updateOrderInfo($orderRecordUpdateData, $orderId)
{
// 判断:是否存在子订单信息
$orderSubList = $orderRecordUpdateData['order_sub_list'] ?? [];
unset($orderRecordUpdateData['order_sub_list']);
if (count($orderSubList) > 0) $this->updateOrCreateSubOrder($orderSubList, $orderId);//创建子订单
// 修改订单信息
$orderRecordUpdateData['update_time'] = time();
model('supply_order')->update($orderRecordUpdateData, [
['order_id', '=', $orderId]
]);
}
/**
* 订单处理 - 处理子订单信息
* @param $orderSubList
* @param $orderId
* @throws \Exception
*/
public function updateOrCreateSubOrder($orderSubList, $orderId)
{
// 循环处理子订单信息
$subList = array_map(function ($item) use ($orderId) {
return [
'site_id' => $this->site_id,
'order_id' => $orderId,
'result_exception_reason' => '',// 请求结果:订单异常原因 1:恢复正常 2:需要换货 3:需要补发 4:地址错误 5:疫情停发
'result_express_company' => '',// 请求结果:快递公司
'result_express_number' => '',// 请求结果:快递单号
'result_express_status' => 0,// 请求结果:订单物流状态 1 待发货 2 已发货 3 已签收 4 拒收 5 已退款 6 申请退款 7 同意申请 8 拒绝申请
'result_express_time' => '',// 发货时间
'result_id' => $item['offerId'] ?? '',
'goods_id' => $item['goods_id'] ?? '',
'sku_id' => $item['sku_id'] ?? '',
'result_sub_id' => $item['third_order'] ?? '',// 请求结果子订单id
'result_price' => $item['cost_price'] ?? 0,// 请求结果:下单时的商品结算价格
'result_product_specs_id' => $item['specId'] ?? '',// 请求结果:商品规格编号
'result_quantity' => $item['quantity'] ?? 1,// 请求结果:购买单品数量
'result_seller_remarks' => $item['sku_no'] ?? '',// 请求结果:卖家备注
];
}, $orderSubList);
// 获取已经存在的子订单信息
$deleteData = (array)model('supply_sub_order')->getColumn([
['order_id', '=', $orderId],
], 'order_id');
if ($deleteData) {
// 进行对应的操作 先删除、在修改、最后添加
model('supply_sub_order')->delete([
['order_id', '=', $orderId],
['site_id', '=', $this->site_id]
]);
}
$goodsSkuModel = (new NewBaseModel(['table_name' => 'supply_sub_order']));
$goodsSkuModel->saveAll($subList);
return $subList;
}
/***
* 整理下单信息
* @param $orderId 下单ID
* @param $flow general创建大市场订单fenxiao创建分销订单,saleproxy流程将校验分销关系,paired(火拼下单),boutiquefenxiao(精选货源分销价下单采购量1个使用包邮) boutiquepifa(精选货源批发价下单采购量大于2使用). flow如果为空的情况会比价择优预览并返回最优下单方式flow
* @param $openOfferId 是否加密
* @return array
*/
public function getOrderArrangeInfo($orderId, $flow = 'boutiquefenxiao', $openOfferId = 0)
{
$orderGoodsList = $this->getOrderSupplyGoods($orderId);
// 获取规格信息
$skuIds = array_column($orderGoodsList, 'sku_id');
$skuList = model('goods_sku')->getList([
['sku_id', 'in', $skuIds]
], ['sku_id', 'goods_id', 'sku_no', 'cost_price', 'goods_supplier_format']);
// 规格对应的数量信息
$nums = array_column($orderGoodsList, 'num', 'sku_id');
$order = model('order')->getInfo([['order_id', '=', $orderId]], ['site_id', 'order_no', 'province_id', 'city_id', 'district_id', 'address', 'name', 'telephone', 'mobile', 'full_address', 'buyer_message']);
$this->orderInfo = $order;
$this->skuList = $skuList;
$quantity = [];
if (array_sum(array_values($nums)) > 2) {
$flow = 'boutiquepifa';
}
if (empty($order)) return [];
$this->site_id = $order['site_id'];
// 获取收货地址信息
$fullAddress = $order['full_address'] ?? '';// 收货地区信息 格式:省-市-区
$fullAddress = explode('-', $fullAddress);
$orderInfo = [
'flow' => $flow,
'outOrderId' => $order['order_no'],
'message' => $order['buyer_message'],
'addressParam' => [
'fullName' => mb_strlen($order['name'], 'UTF-8') > 1 ? $order['name'] : $order['name'] . $order['name'],//收货人姓名
'mobile' => $order['mobile'], //手机
'phone' => $order['telephone'] ?: $order['mobile'], //电话
'provinceText' => $fullAddress[0] ?? '',//省份文本
'cityText' => $fullAddress[1] ?? '',//市文本
'areaText' => $fullAddress[2] ?? '', //区文本
'townText' => '', //镇文本
'address' => str_replace($order['full_address'] . '-', '', $order['address']), //街道地址
'postCode' => 000000,//邮编
],
'cargoParamList' => array_map(function ($skuItem) use ($nums, $quantity) {
$offer = json_decode($skuItem['goods_supplier_format'], true);
$quantity[$offer['spec_id']] = (int)$nums[$skuItem['sku_id']];
$data = [
'offerId' => $offer['offerId'],
'specId' => $offer['spec_id'],
'quantity' => (int)$nums[$skuItem['sku_id']],
];
if (isset($offer['openOfferId'])) {
$data['openOfferId'] = $offer['openOfferId'];
}
return $data;
}, $skuList),
];
$this->quantity_temp = $quantity;
$orderInfo['addressParam'] = json_encode($orderInfo['addressParam']);
$orderInfo['cargoParamList'] = json_encode($orderInfo['cargoParamList']);
return $orderInfo;
}
/**
* 退款 - 根据子订单发起退款申请
* @param $data
*/
public function refundOrder($data)
{
try {
} catch (\Exception $e) {
Log::debug('1688供应链 - 退款成功 - 供应链退款失败原因:' . $e->getMessage());
}
return [];
}
/***
* 发货
* @param $params
* @return void
*/
public function SendDelivery($params, $site_id, $type = 'CONSIGN')
{
if ($params && isset($params['orderLogsItems']) && $type == 'CONSIGN') {
$orderLogsItems = $params['orderLogsItems'];
$sub_order_ids = array_column($orderLogsItems, 'orderEntryId');
$order_ids = array_column($orderLogsItems, 'orderId');
$where = [
['sub.site_id', '=', $site_id],
['sub.result_sub_id', 'in', $sub_order_ids]
];
$join = [
['order_goods og', 'sub.order_id=og.order_id', 'inner']
];
$info = model('supply_sub_order')->getList($where, 'og.order_goods_id,og.order_id,og.site_id', '', 'sub', $join);
if ($info) {
$cloudApi = new CloudApi($site_id);
$logislist = $cloudApi->getLogisticCompanyList();
$logis = $logislist[$params['cpCode']] ?? [];
if ($logis) {
$companyName = $logis['companyName'];
$companyNo = $logis['companyNo'];
} else {
$companyName = '其他物流';
$companyNo = 'OTHER';
}
$express_company_id = $this->getExpressCompanyId($site_id, $companyName, $companyNo);
$delivery_no = $params['mailNo'] ?? '';
$user_info = model('user')->getInfo([['site_id', '=', $site_id], ['app_module', '=', 'shop']]);
$log_data = [
'uid' => $user_info['uid'],
'nick_name' => $user_info['username'],
'action' => '商家对订单进行了发货',
'action_way' => 2,
];
$order_model = new OrderModel();
foreach ($info as $k => $v) {
$data = array(
'type' => 'manual', //发货方式(手动发货、电子面单)
'order_goods_ids' => $v['order_goods_id'],//商品id
'express_company_id' => $express_company_id,//物流公司
'delivery_no' => $delivery_no,//快递单号
'order_id' => $v['order_id'],//订单id
'delivery_type' => 1,//是否需要物流
'site_id' => $site_id,
'template_id' => 0,//电子面单模板id
'user_info' => $user_info
);
model('supply_sub_order')->update(['result_express_number' => $delivery_no, 'result_express_time' => time(), 'result_express_company' => $companyName], [
'site_id' => $site_id,
'result_sub_id' => $v['result_sub_id']
]);
$order_model->orderGoodsDelivery($data, 1, $log_data);
}
}
}
return $this->success();
}
/***
* 自动添加物流信息
* @param $site_id
* @param $company_name
* @param $express_no
* @return mixed
*/
public function getExpressCompanyId($site_id, $company_name, $express_no)
{
$where = [
['site_id', '=', $site_id],
['express_no', '=', $express_no]
];
$express_company_id = model('express_company')->getValue($where, 'company_id');
if (empty($express_company_id)) {
$data = [
'site_id' => $this->site_id,
'company_name' => $company_name,//物流公司名称
'sort' => 0,//排序
'logo' => '',//logo
'url' => '',//网址
'express_no' => $express_no,//编码
'express_no_kd100' => strtolower($express_no),//编码快递100
'express_no_cainiao' => strtoupper($express_no),//编码(菜鸟)
'express_no_alipay' => strtoupper($express_no),//编码(支付宝)
'content_json' => '',//打印内容
'background_image' => '',//打印背景图
'font_size' => 14,//打印字体大小 单位px
'width' => 0,//显示尺寸宽度 px
'height' => 0,//显示尺寸高度 px
'scale' => 1,//真实尺寸mm与显示尺寸px的比例
'create_time' => time(),
'is_electronicsheet' => 0,//是否支持电子面单
'print_style' => 0,//电子面单打印风格
];
$template_model = new ExpressCompanyTemplate();
$res = $template_model->addExpressCompanyTemplate($data);
if ($res['code'] >= 0) {
//添加店铺模版
$express_company_model = new ExpressCompany();
$company = $express_company_model->addExpressCompany(['site_id' => $site_id, 'company_id' => $res['data']]);
$express_company_id = $company['data'];
Cache::tag("cache_tableexpress_company")->clear();
}
}
return $express_company_id;
}
}

View File

@ -0,0 +1,120 @@
<?php
namespace addon\ali1688\model;
use app\model\BaseModel;
/**
* Common: 供应链商品相关处理
* Author: wu-hui
* Time: 2023/08/30 10:14
* Class Goods
* @package addon\funengscm\model
*/
class Template extends BaseModel
{
protected int $site_id = 0;
protected object $model;
public function __construct($siteId)
{
$this->site_id = $siteId;
$this->model = model('supply_price_template');
}
/**
* Common: 获取模板列表
* Author: wu-hui
* Time: 2023/08/30 16:54
* @param array $search
* @return mixed
*/
public function getTemplateList($search = [])
{
// 查询条件
$where = [
['site_id', '=', $search['site_id']]
];
if (!empty($search['filter']['title'])) $where[] = ['title', 'like', '%' . $search['filter']['title'] . '%'];
// 其他查询配置
$field = 'id,title,price_set,category_id,goods_class,alipaycategory_id,template_id,is_default,create_time,update_time';
$result = $this->model->pageList($where, $field, 'id DESC', $search['page'] ?? 1);
return $this->success($result ?? []);
}
/**
* 添加模板
*/
public function addTemplate($data)
{
if ($data['price_set']) $data['price_set'] = json_encode($data['price_set']);
if ($data['title_set']) $data['title_set'] = json_encode($data['title_set']);
if ($data['sku_set']) $data['sku_set'] = json_encode($data['sku_set']);
if(!isset($data['listing_mode'])){
$data['listing_mode'] = 1;//不上架
}
$result = $this->model->add($data);
if ($result) return json(['code' => '0', 'message' => '添加成功']);
else return json(['code' => '400', 'message' => '添加失败']);
}
/**
* 获取模板详情
* @param $id
* @return void
*
*/
public function templateInfo($id)
{
if (!intval($id)) {
return json(['code' => '400', 'message' => '模板ID错误']);
}
$where = ['id' => $id];
$field = 'id,title,category_id,goods_class,alipaycategory_id,template_id,price_set,listing_mode,title_set,sku_set';
$data = $this->model->getInfo($where, $field);
if ($data) {
if ($data['price_set']) $data['price_set'] = json_decode($data['price_set'], true);
if ($data['title_set']) $data['title_set'] = json_decode($data['title_set'], true);
if ($data['sku_set']) $data['sku_set'] = json_decode($data['sku_set'], true);
}
return $data;
}
/**
* @return void
* 修改模板
*/
public function editTemplate($data)
{
$id = $data['id'];
if (!intval($id)) {
return json(['code' => '400', 'message' => '模板ID错误']);
} else {
unset($data['id']);
}
if ($data['price_set']) $data['price_set'] = json_encode($data['price_set']);
if ($data['title_set']) $data['title_set'] = json_encode($data['title_set']);
if ($data['sku_set']) $data['sku_set'] = json_encode($data['sku_set']);
if ($this->model->update($data, ['id' => $id]))
return json(['code' => '0', 'message' => '保存成功']);
else return json(['code' => '400', 'message' => '保存失败']);
}
/**
* @return void
* 删除模板
*/
public function delTemplate($id)
{
if (!intval($id)) {
return json(['code' => '400', 'message' => '模板ID错误']);
}
if ($this->model->delete(['id' => $id]))
return json(['code' => '0', 'message' => '删除成功']);
else return json(['code' => '400', 'message' => '删除失败']);
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace addon\ali1688\shop\controller;
use app\shop\controller\BaseShop;
use addon\ali1688\model\CloudApi;
class Auth extends BaseShop
{
public function index(){
$code = input('code',0);
$cloudApi=new CloudApi($this->site_id);
$token = $cloudApi->getAccessToken($code);
$this->assign('desc', '授权成功');
$this->assign('img', 'success');
return $this->fetch('success/success');
}
}

View File

@ -0,0 +1,54 @@
<?php
namespace addon\ali1688\shop\controller;
use app\shop\controller\BaseShop;
use addon\ali1688\model\Config as ConfigModel;
use addon\ali1688\model\CloudApi;
class Config extends BaseShop
{
public function basics()
{
$config = new ConfigModel();
$CloudApi = new CloudApi($this->site_id);
$info = $config->getConfig($this->site_id)['data']['value'];
if (request()->isAjax()) {
$isAutoBuyOrder = input('isAutoBuyOrder', 0);
$info['isAutoBuyOrder'] = $isAutoBuyOrder;
$res = $config->setConfig($info, $this->site_id);
return $res;
}
$authorization_url = $CloudApi->getAuthorization_codeurl(request()->domain() . request()->url());
$openPayinfo['isbuyapp'] = false;
$openPayinfo['ispayopen'] = false;
$openPayinfo['signUrl'] = 'https://tradeconfig.1688.com/foundation/withhold_manage.htm';
$status = 1;
if ($CloudApi->access_token) {
$openPayinfo =array_merge($openPayinfo, $CloudApi->getTradeIsopenProtocolPay());
// $getAppBuyInfo = $CloudApi->getAppBuyInfo();
if ($openPayinfo['ispayopen'] == true) {
$status = 2;
}
// if ($getAppBuyInfo['isbuyapp'] == true) {
// $openPayinfo['isbuyapp'] = true;
// }
}
$this->assign('isAuthorization', $CloudApi->access_token);
$this->assign('openPayinfo', $openPayinfo);
$this->assign('authorization_url', $authorization_url);
$this->assign('info', $info);
$this->assign('site_id', $this->site_id);
$this->assign('checkres', [
'code' => 0,
'data' => [
'status' => $status
]]
);
$this->forthMenu();
return $this->fetch("config/basics");
}
public function template()
{
return $this->fetch("config/template");
}
}

View File

@ -0,0 +1,463 @@
<?php
namespace addon\ali1688\shop\controller;
use addon\form\model\Form;
use addon\postertemplate\model\PosterTemplate as PosterTemplateModel;
use addon\supply\model\Supplier as SupplierModel;
use app\model\express\Config as ExpressConfig;
use app\model\express\ExpressTemplate as ExpressTemplateModel;
use app\model\goods\GoodsAttribute as GoodsAttributeModel;
use app\model\goods\GoodsBrand as GoodsBrandModel;
use app\model\goods\GoodsCategory as GoodsCategoryModel;
use app\model\goods\GoodsCommunityQrCode;
use app\model\goods\GoodsLabel as GoodsLabelModel;
use app\model\goods\GoodsService as GoodsServiceModel;
use app\model\web\Config as ConfigModel;
use app\shop\controller\BaseShop;
use addon\ali1688\model\Goods as goodsModel;
use addon\ali1688\model\Template as TemplateModel;
use addon\ali1688\model\Choice;
use addon\ali1688\model\CloudApi;
class Goods extends BaseShop
{
private $goodsModel;
private $Choice;
public function __construct()
{
parent::__construct();
$this->goodsModel = new GoodsModel($this->site_id);
$this->Choice = new Choice($this->site_id);
}
/**
* 查看已入库商品
* @return mixed
*/
public function lists()
{
if (request()->isAjax()) {
// 参数获取
$start_time = input('start_time', '');
$end_time = input('end_time', '');
$search = input('goods_name', '');
if ($start_time && $end_time) {
$condition[] = ['w.create_time', 'between', [date_to_time($start_time), date_to_time($end_time)]];
} elseif (!$start_time && $end_time) {
$condition[] = ['w.create_time', '<=', date_to_time($end_time)];
} elseif ($start_time && !$end_time) {
$condition[] = ['w.create_time', '>=', date_to_time($start_time)];
}
//筛选商品名称
if (!empty($search)) {
$condition[] = ['w.goods_name', 'like', '%' . $search . '%'];
}
$status = input('goods_state', '');
if (!empty($status)) {
$condition[] = ['w.goods_state', '=', $status];
}
$condition[] = ['w.site_id', '=', $this->site_id];
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
return $this->goodsModel->getGoodsList($condition, $page, $page_size);
} else {
$this->forthMenu();
return $this->fetch("goods/lists");
}
}
/**
* @return void
* 选品入库
*/
public function servicegoods()
{
$search['site_id'] = $this->site_id;
$template_list = (new TemplateModel($this->site_id))->getTemplateList($search);
$CloudApi = new CloudApi($this->site_id);
$category = $CloudApi->getAlibabaCategory();
$ProductFilter = $CloudApi->getAlibabaProductFilter();
if ($ProductFilter) {
foreach ($ProductFilter as $key => $value) {
if (in_array($value['key'], ['dyCiphertext', 'ksCiphertext', 'jxhy'])) {
unset($ProductFilter[$key]);
}
}
}
$this->assign('ProductFilter', $ProductFilter);
$this->assign('category_list', $category);
$this->assign('template_list', $template_list['data']['list']);
return $this->fetch('goods/servicegoods');
}
/**
* @return void
* 选品入库
*/
public function putIn()
{
if (request()->isAjax()) {
$category_id = input("category_id", 0);// 分类id
$productID = input("productID");// 分类id
$category_json = json_encode($category_id);//分类字符串
$category_id = ',' . implode(',', $category_id) . ',';
$goods_id = input("goods_id", 0);// 商品id
$data = [
'goods_id' => $goods_id,// 商品id
'goods_name' => input("goods_name", ""),// 商品名称,
'goods_attr_class' => input("goods_attr_class", ""),// 商品类型id,
'goods_attr_name' => input("goods_attr_name", ""),// 商品类型名称,
'is_limit' => input("is_limit", "0"),// 商品是否限购,
'limit_type' => input("limit_type", "1"),// 商品限购类型,
'site_id' => $this->site_id,
'category_id' => $category_id,
'category_json' => $category_json,
'goods_image' => input("goods_image", ""),// 商品主图路径
'goods_content' => input("goods_content", ""),// 商品详情
'goods_state' => input("goods_state", ""),// 商品状态1.正常0下架
'price' => input("price", 0),// 商品价格取第一个sku
'market_price' => input("market_price", 0),// 市场价格取第一个sku
'cost_price' => input("cost_price", 0),// 成本价取第一个sku
'sku_no' => input("sku_no", ""),// 商品sku编码
'weight' => input("weight", ""),// 重量
'volume' => input("volume", ""),// 体积
'goods_stock' => input("goods_stock", 0),// 商品库存(总和)
'goods_stock_alarm' => input("goods_stock_alarm", 0),// 库存预警
'is_free_shipping' => input("is_free_shipping", 1),// 是否免邮
'shipping_template' => input("shipping_template", 0),// 指定运费模板
'goods_spec_format' => input("goods_spec_format", ""),// 商品规格格式
'goods_attr_format' => input("goods_attr_format", ""),// 商品参数格式
'introduction' => input("introduction", ""),// 促销语
'keywords' => input("keywords", ""),// 关键词
'unit' => input("unit", ""),// 单位
'sort' => input("sort", 0),// 排序,
'video_url' => input("video_url", ""),// 视频
'goods_sku_data' => input("goods_sku_data", ""),// SKU商品数据
'goods_service_ids' => input("goods_service_ids", ''),// 商品服务id集合
'label_id' => input("label_id", ''),// 商品分组id
'brand_id' => input("brand_id", 0),//品牌id
'virtual_sale' => input("virtual_sale", 0),// 虚拟销量
'max_buy' => input("max_buy", 0),// 限购
'min_buy' => input("min_buy", 0),// 起售
'recommend_way' => input('recommend_way', 0), // 推荐方式1新品2精品3推荐
'timer_on' => strtotime(input('timer_on', 0)),//定时上架
'timer_off' => strtotime(input('timer_off', 0)),//定时下架
'spec_type_status' => input('spec_type_status', 0),
'is_consume_discount' => input('is_consume_discount', 0),//是否参与会员折扣
'qr_id' => input('qr_id', 0),//社群二维码id
'sale_show' => input('sale_show', 0),//
'stock_show' => input('stock_show', 0),//
'market_price_show' => input('market_price_show', 0),//
'barrage_show' => input('barrage_show', 0),//
'template_id' => input('template_id', 0),//商品海报id
'form_id' => input('form_id', 0),
'support_trade_type' => input('support_trade_type', ''),
'sale_channel' => input('sale_channel', 'all'),
'sale_store' => input('sale_store', 'all'),
'is_unify_pirce' => input('is_unify_pirce', '1'),
'is_zmxx' => input('is_zmxx', 0),
'cat_id' => input('cat_id', ''),
];
if ($goods_id) {
$data['site_id'] = $this->site_id;
$goods_image = explode(',', $data['goods_image']);
$goods_sku_data = json_decode($data['goods_sku_data'], true);
$sku_image = array_column($goods_sku_data, 'sku_image');
$goods_images = array_unique(array_merge($goods_image, $sku_image));
$this->goodsModel->GooodsImgCheck($data['site_id'], $goods_images);//验证图片上传
$res = (new \app\model\goods\Goods())->editGoods($data);
return $res;
} else {
$template_id = input('template_id', 0);
return $this->goodsModel->addGoods($data, $this->site_id, $productID, $template_id);
}
} else {
$data = request()->all();
$data_list = $this->Choice->productInfoGet($data['itemId']);
if (!$data_list['result']['success']) {
return $this->error($data_list['result']['message'], '');
}
$aliGoodsInfo = $data_list['result']['result'][0]['productInfo'];
if ($aliGoodsInfo['bizType'] != 1) return $this->error('', '暂不支持非商品请选择其他商品');
// $freightTemplate = $aliGoodsInfo['shippingInfo'];
// //运费模板
// if(isset($freightTemplate['freightTemplateID']) && ($freightTemplate['freightTemplateID'] != 0 && $freightTemplate['freightTemplateID'] != 1)){
// $freight_detail = $this->Choice->productFreightTemplate($freightTemplate['freightTemplateID']);
// }
$price_template = input('template_id', 0);
$saleType = input('saleType', 'normal');
$sku_url = $this->goodsModel->getDefaultSkuImage();
$goods_info = $this->goodsModel->generateGoodsInfo($aliGoodsInfo, $price_template, $saleType);
if ($goods_info['goods_id']) {
$editGoodsInfo = event('editGoodsInfo', ['goods_id' => $goods_info['goods_id'], 'site_id' => $this->site_id]);
if ($editGoodsInfo) {
foreach ($editGoodsInfo as $item) {
if ($item['apptype'] == 'aliapp') {
$this->assign("alipay_category_id", $item['category_id'] ?? '');
}
}
}
}
$search['site_id'] = $this->site_id;
$template_list = (new TemplateModel($this->site_id))->getTemplateList($search);
$this->assign('categoryName', $aliGoodsInfo['categoryName']);
$this->assign('goods_id', $goods_info['goods_id']);
$this->assign('productID', $aliGoodsInfo['productID']);
$this->assign('template_id', $price_template);
$this->assign('goods_info', $goods_info);
$this->assign('sku_url', $sku_url);
$this->assign('template_list', $template_list['data']['list']);
// $this->assign('bizType', ['1' => '商品', '2' => '加工', '3' => '代理', '4' => '合作', '5' => '商务服务']);
// $productType = ['wholesale' => '在线批发商品', 'sourcing' => '询盘商品'];
// $this->assign('productType', $productType);
//获取一级商品分类
$goods_category_model = new GoodsCategoryModel();
$condition = [
['pid', '=', 0],
['site_id', '=', $this->site_id]
];
$goods_category_list = $goods_category_model->getCategoryList($condition, 'category_id,category_name,level,commission_rate')['data'];
$this->assign("goods_category_list", $goods_category_list);
//获取运费模板
$express_template_model = new ExpressTemplateModel();
$express_template_list = $express_template_model->getExpressTemplateList([['site_id', "=", $this->site_id]], 'template_id,template_name', 'is_default desc')['data'];
if (empty($express_template_list)) {
return $this->error("请设置运费模板");
}
$this->assign("express_template_list", $express_template_list);
//获取商品类型
$goods_attr_model = new GoodsAttributeModel();
$attr_class_list = $goods_attr_model->getAttrClassList([['site_id', '=', $this->site_id]], 'class_id,class_name')['data'];
$this->assign("attr_class_list", $attr_class_list);
// 商品服务
$goods_service_model = new GoodsServiceModel();
$service_list = $goods_service_model->getServiceList([['site_id', '=', $this->site_id]], 'id,service_name,icon')['data'];
$this->assign("service_list", $service_list);
// 商品分组
$goods_label_model = new GoodsLabelModel();
$label_list = $goods_label_model->getLabelList([['site_id', '=', $this->site_id]], 'id,label_name', 'sort asc')['data'];
$this->assign("label_list", $label_list);
//商品默认排序值
$config_model = new ConfigModel();
$sort_config = $config_model->getGoodsSort($this->site_id, $this->app_module);
$sort_config = $sort_config['data']['value'];
$this->assign("sort_config", $sort_config);
//获取品牌
$goods_brand_model = new GoodsBrandModel();
$brand_list = $goods_brand_model->getBrandList([['site_id', '=', $this->site_id]], "brand_id, brand_name")['data'];
$this->assign("brand_list", $brand_list);
//获取商品海报
$poster_template_model = new PosterTemplateModel();
$poster_list = $poster_template_model->getPosterTemplateList([['site_id', '=', $this->site_id], ['template_status', '=', 1]], 'template_id,poster_name,site_id');
$this->assign('poster_list', $poster_list['data']);
$this->assign('virtualcard_exit', addon_is_exit('virtualcard', $this->site_id));
//获取社群二维码
$goods_community_model = new GoodsCommunityQrCode();
$goods_community_qr_list = $goods_community_model->getQrList([['site_id', '=', $this->site_id], ['qr_state', '=', 1]], 'qr_id,qr_name,site_id');
$this->assign('goods_community_qr_list', $goods_community_qr_list['data']);
$form_is_exit = addon_is_exit('form', $this->site_id);
if ($form_is_exit) {
$form_list = (new Form())->getFormList([['site_id', '=', $this->site_id], ['form_type', '=', 'goods'], ['is_use', '=', 1]], 'id desc', 'id, form_name')['data'];
$this->assign('form_list', $form_list);
}
$this->assign('form_is_exit', $form_is_exit);
$express_type = (new ExpressConfig())->getEnabledExpressType($this->site_id);
$this->assign('express_type', $express_type);
$this->assign('all_goodsclass', event('GoodsClass'));
$this->assign('goods_class', (new \app\model\goods\Goods())->getGoodsClass());
$this->assign('store_is_exit', addon_is_exit('store', $this->site_id));
$is_install_supply = addon_is_exit("supply");
if ($is_install_supply) {
$supplier_model = new SupplierModel();
$supplier_list = $supplier_model->getSupplyList([['supplier_site_id', '=', $this->site_id]], 'supplier_id,title', 'supplier_id desc')['data'];
$this->assign("supplier_list", $supplier_list);
}
$this->assign("is_install_supply", $is_install_supply);
$config = new \addon\aliapp\model\Config();
$config_info = $config->getAppConfig($this->site_id)['data']['value'];
$is_alipay_goods = 0;
if ($config_info) {
$is_alipay_goods = 1;
}
$this->assign("is_alipay_goods", $is_alipay_goods);
return $this->fetch('goods/edit_goods');
}
}
/**
* @return void
* 批量入库
*/
public function putIns()
{
if (request()->isAjax()) {
$category_id = input("category_id", 0);// 分类id
$goods_id = input("item_id", 0);// 商品id
$category_json = json_encode($category_id);//分类字符串
$category_id = ',' . implode(',', $category_id) . ',';
$saleType = input("saleType", 'normal');
if (is_array($goods_id) && count($goods_id) > 0) {
$data_list = $this->Choice->productInfoGet($goods_id);
$aliGoodsInfo = $data_list['result']['result'];
$price_template = input('template_id', 0);
$success = $fail = 0;
$template_id = 0;
if ($saleType != 'normal') {
$template_id = model('express_template')->getValue(['site_id' => $this->site_id, 'is_default' => 1], 'template_id');
if (empty($template_id)) return $this->error('请先设置默认运费模板');
}
foreach ($aliGoodsInfo as $key => $val) {
if ($val['productInfo']['bizType'] == 1) {
$goods_info = $this->goodsModel->generateGoodsInfo($val['productInfo'], $price_template, $saleType);
$data = [
// 商品id
'goods_name' => $goods_info['goods_name'],
// 商品名称,
'goods_attr_class' => input("goods_attr_class", ""),
// 商品类型id,
'goods_attr_name' => input("goods_attr_name", ""),
// 商品类型名称,
'is_limit' => input("is_limit", "0"),
// 商品是否限购,
'limit_type' => input("limit_type", "1"),
// 商品限购类型,
'site_id' => $this->site_id,
'category_id' => $category_id,
'category_json' => $category_json,
'goods_image' => $goods_info['goods_image'],
// 商品主图路径
'goods_content' => $goods_info['goods_content'],
// 商品详情
'goods_state' => 0,
// 商品状态1.正常0下架
'price' => $goods_info['sku_list'][0]['price'],
// 商品价格取第一个sku
'market_price' => $goods_info['sku_list'][0]['market_price'],
// 市场价格取第一个sku
'cost_price' => $goods_info['sku_list'][0]['cost_price'],
// 成本价取第一个sku
'sku_no' => $goods_info['sku_list'][0]['sku_no'],
// 商品sku编码
'weight' => $goods_info['sku_list'][0]['weight'],
// 重量
'volume' => $goods_info['sku_list'][0]['volume'],
// 体积
'goods_stock' => array_sum(array_column($goods_info['sku_list'], 'stock')),
// 商品库存(总和)
'goods_stock_alarm' => input("goods_stock_alarm", 0),
// 库存预警
'is_free_shipping' => $goods_info['is_free_shipping'],//input("is_free_shipping",1),
'shipping_template' => $template_id,//运费模版 // 是否免邮
// 指定运费模板
'goods_spec_format' => $goods_info['goods_spec_format'],
// 商品规格格式
'goods_attr_format' => $goods_info['goods_attr_format'],
// 商品参数格式
'introduction' => $goods_info['introduction'],
// 促销语
'keywords' => $goods_info['keywords'],
// 关键词
'unit' => $goods_info['unit'],
// 单位
'sort' => $goods_info['sort'],
// 排序,
'video_url' => $goods_info['video_url'],
// 视频
'goods_sku_data' => $goods_info['goods_sku_data'],
// SKU商品数据
'goods_service_ids' => input("goods_service_ids", ''),
// 商品服务id集合
'label_id' => input("label_id", ''),
// 商品分组id
'brand_id' => input("brand_id", 0),
//品牌id
'virtual_sale' => $goods_info['virtual_sale'],
// 虚拟销量
'max_buy' => $goods_info['max_buy'],
// 限购
'min_buy' => $goods_info['min_buy'],
// 起售
'recommend_way' => input('recommend_way', 0),
// 推荐方式1新品2精品3推荐
'timer_on' => strtotime(input('timer_on', 0)),
//定时上架
'timer_off' => strtotime(input('timer_off', 0)),
//定时下架
'spec_type_status' => empty($goods_info['spec_type_status']) ? 0 : 1,
'is_consume_discount' => $goods_info['is_consume_discount'],
//是否参与会员折扣
'qr_id' => $goods_info['qr_id'],
//社群二维码id
'sale_show' => $goods_info['sale_show'],
'stock_show' => $goods_info['stock_show'],
'market_price_show' => $goods_info['market_price_show'],
'barrage_show' => $goods_info['barrage_show'],
'template_id' => 0,
//商品海报id
'form_id' => 0,
'support_trade_type' => $goods_info['support_trade_type'],
'sale_channel' => input('sale_channel', 'all'),
'sale_store' => input('sale_store', 'all'),
'is_unify_pirce' => $goods_info['is_unify_pirce'],
'is_zmxx' => $goods_info['is_zmxx'],
'cat_id' => '',
];
$res = $this->goodsModel->addGoods($data, $this->site_id, $val['productInfo']['productID'], $price_template);
if ($res['code'] === 0) {
$success++;
} else {
$fail++;
}
} else {
$fail++;
}
}
$msg = '入库成功' . $success . '件商品';
return ['code' => 0, 'data' => '入库成功', 'message' => $fail > 0 ? $msg . ',入库失败' . $fail . '件' : $msg];
}
} else {
$data = request()->all();
//获取一级商品分类
$goods_category_model = new GoodsCategoryModel();
$condition = [
['pid', '=', 0],
['site_id', '=', $this->site_id]
];
$template_id = input('template_id', 0);
$goods_category_list = $goods_category_model->getCategoryList($condition, 'category_id,category_name,level,commission_rate')['data'];
$this->assign("goods_category_list", $goods_category_list);
$this->assign("item_id", $data['itemId']);
$this->assign("template_id", $template_id);//单独选择模板
$search['site_id'] = $this->site_id;
$template_list = (new TemplateModel($this->site_id))->getTemplateList($search);
$this->assign('template_list', $template_list['data']['list']);
return $this->fetch('goods/putins');
}
}
/**
* @return void
* 从1688获取入库商品
*/
public function getGoodsList()
{
$param = request()->all();
return $this->Choice->productlist($param);
}
}

View File

@ -0,0 +1,116 @@
<?php
namespace addon\ali1688\shop\controller;
use app\shop\controller\BaseShop;
use addon\ali1688\model\Order as orderModel;
class Order extends BaseShop
{
/**
* Common: 进入订单列表
* Author: wu-hui
* Time: 2023/09/05 10:59
* @return array|mixed
*/
public function lists()
{
if (request()->isAjax()) {
// 参数获取
$search = request()->all();
$search['site_id'] = $this->site_id;
return (new OrderModel())->getOrderList($search);
} else {
$this->forthMenu();
return $this->fetch("order/lists");
}
}
/***
* 获取子菜单
* @return array|mixed
*/
public function seeSubOrder()
{
$order_id = input('order_id', 0);
if (request()->isAjax()) {
$search = request()->all();
$res = (new orderModel())->getSubOrder($this->site_id, $order_id,$search);
return $res;
}
return $this->fetch('order/sub_list', ['order_id' => $order_id]);
}
/**
* Common: 请求重新下单
* Author: wu-hui
* Time: 2023/09/05 11:18
* @return array
*/
public function reorder()
{
// 参数获取
$orderId = input('order_id', 0);
if ((int)$orderId <= 0) return error(-1, '订单不存在!');
// 获取订单信息
$orderInfo = model('order')->getInfo([
['order_id', '=', $orderId]
]);
if($orderInfo['pay_status']!=1) return error(-1, '买家未付款无需下单!');
$res = (new orderModel())->orderCreateRequest($orderId);
return $res;
}
/**
* Common: 子订单 - 单个商品申请退款
* Author: wu-hui
* Time: 2023/09/06 16:12
* @return array
*/
public function subOrderRefund()
{
$info = input('info', []);
$info['site_id'] = $this->site_id;
(new orderModel())->refundOrder($info);
return success(0, '退款申请成功!');
}
/***
* 发起免密支付
* @return void
*/
public function buyPay()
{
$id = input('order_id', 0);
if (request()->isAjax()) {
$res = (new orderModel())->noPasswordPay($this->site_id, $id);
return $res;
}
}
/***
* 在线支付
* @return array|void|null
*/
public function onlinePay()
{
$id = input('order_id', 0);
if (request()->isAjax()) {
$res = (new orderModel())->onlinePay($this->site_id, $id);
return $res;
}
}
/***
* 取消订单
* @return array|void|null
*/
public function cancelOrder()
{
if (request()->isAjax()) {
$data = request()->all();
$res = (new orderModel())->cancelOrder($this->site_id, $data['order_id'], $data['cancelReason']);
return $res;
}
}
}

View File

@ -0,0 +1,91 @@
<?php
namespace addon\ali1688\shop\controller;
use addon\ali1688\model\Choice;
use addon\ali1688\model\Template as TemplateModel;
use app\model\goods\GoodsCategory as GoodsCategoryModel;
use app\shop\controller\BaseShop;
use app\model\express\ExpressTemplate;
class Template extends BaseShop
{
private $templateModel;
public function __construct()
{
parent::__construct();
$this->templateModel = new TemplateModel($this->site_id);
}
public function lists()
{
if (request()->isAjax()) {
// 参数获取
$search = request()->all();
$search['site_id'] = $this->site_id;
return $this->templateModel->getTemplateList($search);
}
$this->forthMenu();
return $this->fetch("template/lists");
}
public function add()
{
if (request()->isAjax()) {
// 参数获取
$data = request()->all();
$data['site_id'] = $this->site_id;
$data['create_time'] = time();
return $this->templateModel->addTemplate($data);
}
$this->get_list();
return $this->fetch("template/add");
}
public function get_list()
{
//获取一级商品分类
$goods_category_model = new GoodsCategoryModel();
$condition = [
['pid', '=', 0],
['site_id', '=', $this->site_id]
];
$goods_category_list = $goods_category_model->getCategoryList($condition, 'category_id,category_name,level,commission_rate')['data'];
$this->assign("goods_category_list", $goods_category_list);
$express_template_model = new ExpressTemplate();
$condition = array(
['site_id', "=", $this->site_id],
);
$express_template_list = $express_template_model->getExpressTemplatePageList($condition);
$this->assign("express_template_list", $express_template_list['data']['list']);
$this->assign('goods_class', array_column(event('GoodsClass'), null, 'goods_class'));
}
public function edit()
{
$data = request()->all();
if (!isset($data['id']) && !intval($data['id'])) {
return $this->error('模板ID错误');
}
if (request()->isAjax()) {
$data['update_time'] = time();
return $this->templateModel->editTemplate($data);
}
$data = $this->templateModel->templateInfo($data['id']);
$this->assign('data', $data);
$this->get_list();
return $this->fetch("template/edit");
}
public function del()
{
$data = request()->all();
if (!isset($data['id']) && !intval($data['id'])) {
return $this->error('模板ID错误');
}
if (request()->isAjax()) {
return $this->templateModel->delTemplate($data['id']);
}
}
}

View File

@ -0,0 +1,318 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style type="text/css">
.access {
padding: 10px;
}
.access-title {
font-size: 18px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #333333;
}
.access-item {
background-color: #F8F8F8;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.item {
display: flex;
justify-content: space-between;
margin: 20px 0 20px 10px;
}
.item-datail {
position: relative;
}
.item-number {
width: 30px;
height: 30px;
border-radius: 50%;
border: 5px solid #eee;
position: absolute;
top: -5px;
left: -45px;
box-sizing: border-box;
font-size: 10px;
line-height: 20px;
}
.item-number label {
width: 20px;
height: 20px;
background: #ddd;
border-radius: 50%;
text-align: center;
color: #FFFFFF !important;
display: inline-block;
font-size: 12px;
}
.item-number.active {
border: 5px solid rgba(255, 106, 0, 0.5);
}
.item-number.active label {
background: #FF6A00;
}
.item-check {
position: absolute;
top: 5px;
left: 20px;
width: 25px;
height: 25px;
background: #CCCCCC;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.item-check i {
border-radius: 50%;
border: none;
font-size: 14px;
color: #fff
}
.item-checked {
background: rgba(255, 106, 0, 0.5);
border-radius: 50%;
}
.item-checked i {
color: #ff6a00
}
.item-datail div {
font-size: 14px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #333333;
margin-bottom: 10px;
}
.item-datail p {
display: inline-block;
font-size: 12px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #999999;
}
.item-datail a {
font-size: 12px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #FF6A00 !important;
}
.item button {
width: 88px;
height: 34px;
background: #FF6A00;
border-radius: 2px;
border: 1px solid #FFFFFF;
font-weight: 400;
color: #FFFFFF;
cursor: pointer;
}
.item span, .item a, .item button {
margin-right: 40px;
margin-top: 10px;
}
.layui-timeline-item:before {
top: 27px;
}
.order-pay-layer .wrap {
display: flex;
}
.order-pay-layer .wrap .flex {
flex: 1
}
.order-pay-layer .wrap .flex:last-child {
border-left: 1px solid #eee
}
.order-pay-layer .qrcode img {
width: 150px;
margin: auto;
display: block;
}
.order-pay-layer .goods-name {
margin-right: 15px;
font-weight: bold;
}
.order-pay-layer .price {
margin-right: 15px;
margin-top: 15px;
font-weight: bold;
}
.order-pay-layer .tips {
margin-bottom: 15px;
}
a:hover {
text-decoration: none !important;
cursor: pointer
}
.layui-form-switch.layui-form-onswitch i {
left: 60px;
}
</style>
{/block}
{block name="main"}
<div class="access">
<div class="access-title">1688精选代发</div>
<ul class="layui-timeline">
<li class="layui-timeline-item">
<div class="layui-timeline-content layui-text">
<div class="item">
<div class="item-datail">
<div class="item-number active">
<label>1</label>
</div>
<div>创建1688账号</div>
<p>在1688中创建视频号如已有1688可越过该步骤。</p>
</div>
<a href="https://www.yuque.com/yuqueyonghuwahz8b/ogiw29/pu91wla30g49l7gv?singleDoc# 《1688商户服务端订购》" target="_blank" class="layui-btn">接入指南</a>
</div>
</div>
</li>
<li class="layui-timeline-item">
<div class="layui-timeline-content layui-text">
<div class="item">
<div class="item-datail">
<div class="item-number {if $checkres['code'] == 0 && $checkres['data']['status'] == 2}active{/if}">
<label>2</label>
</div>
<div>请完成1688 "精选代发" 应用订购</div>
<p>
<p>已完成"精选代发"订购可继续下一步去授权! 还未订购"精选代发" <a href="https://pc.1688.com/product/detail.htm?productCode=%2FsClit4uiK6vE7gTlaYnxcUfLH0YZr%2F5fHp0i8ddYOY%3D&productType=GROUP" target="_blank">去订购</a></p>
</p>
</div>
</div>
<div class="access-item">
<div class="item">
<div class="item-datail">
<div class="item-check {if $isAuthorization } item-checked {/if}">
<i class="iconfont iconduihao"></i>
</div>
<div style="margin-left: 60px;">
<label>1688平台服务授权</label>
<br>
{if $isAuthorization ==''}
<p>去完成1688平台授权<a style="color: #37abff;" href="{$authorization_url}">去授权</a></p>
{else}
<p>去完成1688平台授权<a style="color: #37abff;" href="{$authorization_url}">重新授权</a></p>
{/if}
</div>
</div>
{if $isAuthorization!=''}
<span>已完成</span>
{else}
<span>未授权</span>
{/if}
</div>
<div class="item">
<div class="item-datail">
<div class="item-check {if $openPayinfo['ispayopen'] == true }item-checked{/if}">
<i class="iconfont iconduihao"></i>
</div>
<div style="margin-left: 60px;">
<label>完成支付宝代扣</label>
<br>
<p>请完成1688支付宝自动代扣协议
{if $isAuthorization!='' && !$openPayinfo.ispayopen}
<a href="{$openPayinfo.signUrl}" target="_blank">前去签约</a>
{/if}
</p>
</div>
</div>
{if $openPayinfo.ispayopen}
<span>已完成</span>
{else}
<span>未完成</span>
{/if}
</div>
</div>
</div>
</li>
<li class="layui-timeline-item">
<div class="layui-timeline-content layui-text">
<div class="item">
<div class="item-datail">
<div class="item-number {if $openPayinfo.ispayopen == true && $openPayinfo.isbuyapp == true} active {/if}">
<label>3</label>
</div>
<div>完成了去选品</div>
{if $openPayinfo.ispayopen == true}
<p>开通成功之后 选品库中的商品 商家到产品库<a href="{:addon_url('ali1688/shop/goods/lists')}" target="_blank">前去添加</a>
{/if}
</p>
</div>
</div>
</div>
</li>
<li class="layui-timeline-item">
<div class="layui-timeline-content layui-text">
<div class="item">
<div class="item-datail">
<div class="item-number {if $info.isAutoBuyOrder??''} active {/if}">
<label>4</label>
</div>
<div>开启自动下单</div>
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">开启自动下单</label>
<div class="layui-input-block">
<input type="checkbox" name="isAutoBuyOrder" lay-skin="switch" value="1"
lay-filter="isAutoBuyOrder" lay-text="开启|关闭" {if $info.isAutoBuyOrder??''} checked {/if} >
</div>
<div class="word-aux">
<p>客户下单后系统将完成自动化下单到1688精选</p>
</div>
</div>
</div>
</div>
</div>
</div>
</li>
</ul>
</div>
<div class="layui-form">
</div>
{/block}
{block name="script"}
<script type="text/javascript">
var laytpl, repeat_flag = false;
layui.use(['form', 'laydate'], function () {
laytpl = layui.laytpl;
var form = layui.form, laydate = layui.laydate, repeat_flag = false; //防重复标识
form.render();
form.on('switch(isAutoBuyOrder)', function (data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("ali1688://shop/config/basics"),
dataType: 'JSON',
type: 'POST',
data: {
isAutoBuyOrder: data.elem.checked ? 1 : 0
},
success: function (res) {
layer.msg(res.message);
repeat_flag=false;
}
})
})
});
function apply() {
$.ajax({
url: ns.url("shopcomponent://shop/goods/access"),
dataType: 'JSON',
type: 'POST',
success: function (res) {
if (res.code == 0) {
layer.msg('开通成功');
setTimeout(function () {
location.reload();
}, 1000)
} else {
layer.msg(res.message);
}
}
});
}
</script>
{/block}

View File

@ -0,0 +1,275 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style type="text/css">
.access {
padding: 10px;
}
.access-title {
font-size: 18px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #333333;
}
.access-item {
background-color: #F8F8F8;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.item {
display: flex;
justify-content: space-between;
margin: 20px 0 20px 10px;
}
.item-datail {
position: relative;
}
.item-number {
width: 30px;
height: 30px;
border-radius: 50%;
border: 5px solid #eee;
position: absolute;
top: -5px;
left: -45px;
box-sizing: border-box;
font-size: 10px;
line-height: 20px;
}
.item-number label {
width: 20px;
height: 20px;
background: #ddd;
border-radius: 50%;
text-align: center;
color: #FFFFFF !important;
display: inline-block;
font-size: 12px;
}
.item-number.active {
border: 5px solid rgba(255, 106, 0, 0.5);
}
.item-number.active label {
background: #FF6A00;
}
.item-check {
position: absolute;
top: 5px;
left: 20px;
width: 25px;
height: 25px;
background: #CCCCCC;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.item-check i {
border-radius: 50%;
border: none;
font-size: 14px;
color: #fff
}
.item-checked {
background: rgba(255, 106, 0, 0.5);
border-radius: 50%;
}
.item-checked i {
color: #ff6a00
}
.item-datail div {
font-size: 14px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #333333;
margin-bottom: 10px;
}
.item-datail p {
display: inline-block;
font-size: 12px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #999999;
}
.item-datail a {
font-size: 12px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #FF6A00 !important;
}
.item button {
width: 88px;
height: 34px;
background: #FF6A00;
border-radius: 2px;
border: 1px solid #FFFFFF;
font-weight: 400;
color: #FFFFFF;
cursor: pointer;
}
.item span, .item a, .item button {
margin-right: 40px;
margin-top: 10px;
}
.layui-timeline-item:before {
top: 27px;
}
.order-pay-layer .wrap {
display: flex;
}
.order-pay-layer .wrap .flex {
flex: 1
}
.order-pay-layer .wrap .flex:last-child {
border-left: 1px solid #eee
}
.order-pay-layer .qrcode img {
width: 150px;
margin: auto;
display: block;
}
.order-pay-layer .goods-name {
margin-right: 15px;
font-weight: bold;
}
.order-pay-layer .price {
margin-right: 15px;
margin-top: 15px;
font-weight: bold;
}
.order-pay-layer .tips {
margin-bottom: 15px;
}
a:hover {
text-decoration: none !important;
cursor: pointer
}
</style>
{/block}
{block name="main"}
<div class="access">
<div class="access-title">1688精选代发</div>
<ul class="layui-timeline">
<li class="layui-timeline-item">
<div class="layui-timeline-content layui-text">
<div class="item">
<div class="item-datail">
<div class="item-number active">
<label>1</label>
</div>
<div>创建1688账号</div>
<p>在1688中创建视频号如已有1688可越过该步骤。</p>
</div>
<a href="https://www.yuque.com/yuqueyonghuwahz8b/ogiw29/ioyzisgv1kccwnkh?singleDoc# 《1688代发指南》" target="_blank" class="layui-btn">接入指南</a>
</div>
</div>
</li>
<li class="layui-timeline-item">
<div class="layui-timeline-content layui-text">
<div class="item">
<div class="item-datail">
<div class="item-number {if $checkres['code'] == 0 && $checkres['data']['status'] == 2}active{/if}">
<label>2</label>
</div>
<div>1688代发精选</div>
<p>去订购'精选代发'开通之后<a href="{$authorization_url}" target="_blank">去订购</a></p>
</div>
</div>
<div class="access-item">
<div class="item">
<div class="item-datail">
<div class="item-check {if $checkres['code'] == 0 && $checkres['data']['status'] == 2 }item-checked{/if}">
<i class="iconfont iconduihao"></i>
</div>
<div style="margin-left: 60px;">
<label>完成支付宝代扣</label>
<br>
<p>请完成1688支付宝自动代扣协议<a
href="{:addon_url('shopcomponent://shop/goods/lists')}">前去添加</a></p>
</div>
</div>
<span>已完成</span>
</div>
</div>
</div>
</li>
<li class="layui-timeline-item">
<div class="layui-timeline-content layui-text">
<div class="item">
<div class="item-datail">
<div class="item-number {if $checkres['code'] == 0 && $checkres['data']['status'] == 2 }active{/if}">
<label>3</label>
</div>
<div>完成了去选品</div>
<p>开通成功之后 选品库中的商品 商家到产品库<a href="{:addon_url('ali1688/shop/goods/lists')}" target="_blank">前去添加</a>
</p>
</div>
</div>
</div>
</li>
<li class="layui-timeline-item">
<div class="layui-timeline-content layui-text">
<div class="item">
<div class="item-datail">
<div class="item-number {if $checkres['code'] == 0 && $checkres['data']['status'] == 2 }active{/if}">
<label>4</label>
</div>
<div>开启自动下单</div>
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">开启自动下单</label>
<div class="layui-input-block">
<input type="checkbox" name="isAutoBuyOrder" lay-skin="switch" value="1"
lay-filter="switchTest" lay-text="ON|OFF" {if $info.isAutoBuyOrder??''} checked {/if} >
</div>
<div class="word-aux">
<p>客户下单后系统将完成自动化下单到1688精选</p>
</div>
</div>
</div>
</div>
</div>
</div>
</li>
</ul>
</div>
<div class="layui-form">
</div>
{/block}
{block name="script"}
<script type="text/javascript">
var laytpl, repeatTag = false;
layui.use(['form', 'laydate'], function () {
laytpl = layui.laytpl;
var form = layui.form, laydate = layui.laydate, repeat_flag = false; //防重复标识
form.render();
});
function apply() {
$.ajax({
url: ns.url("shopcomponent://shop/goods/access"),
dataType: 'JSON',
type: 'POST',
success: function (res) {
if (res.code == 0) {
layer.msg('开通成功');
setTimeout(function () {
location.reload();
}, 1000)
} else {
layer.msg(res.message);
}
}
});
}
</script>
{/block}

View File

@ -0,0 +1,353 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style>
.goods-table-content{
width: calc(100% - 40px) !important;
padding: 0 20px 30px 20px;
}
.goods-info{
display: inline-flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: center;
height: 60px;
width: 100% !important;
}
.goods-info .goods-info-image{
width: 50px;
height: 50px;
margin-right: 10px;
}
.goods-info .goods-info-image .goods-logo{
width: 100% !important;
height: 100% !important;
}
.goods-info .goods-info-desc{
height: 50px;
display: inline-flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: center;
align-items: flex-start;
width: calc(100% - 65px);
}
.goods-info .goods-info-desc .name{
height: 25px;
width: 100%;
line-height: 25px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.goods-info .goods-info-desc .brand{
height: 25px;
line-height: 25px;
}
.button-group{
display: inline-flex;
}
</style>
{/block}
{block name="body"}
<!-- 顶部搜索 -->
<div class="screen layui-collapse">
<div class="layui-colla-item">
<div class="layui-colla-content layui-form layui-show member-form" lay-filter="search_form">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">商品名称</label>
<div class="layui-input-inline input-append">
<input type="text" class="layui-input" name="goods_name" autocomplete="off">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">商品分类</label>
<div class="layui-input-inline">
<select name="cate_id" lay-search="">
<option value="">全部分类</option>
{foreach $cate_list as $cateKey => $cateVal}
<optgroup label="{$cateVal['name']}">
{foreach $cateVal['children'] as $cateChildrenKey => $cateChildrenVal}
<option value="{$cateChildrenVal['id']}">{$cateChildrenVal['name']}</option>
{/foreach}
</optgroup>
{/foreach}
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">品牌</label>
<div class="layui-input-inline">
<select name="brand_name" lay-search="">
<option value="">全部品牌</option>
{foreach $brand_list as $brandKey => $brandVal}
<option value="{$brandVal['name']}">{$brandVal['name']}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">折扣起</label>
<div class="layui-input-inline input-append">
<input type="number" step="0.01" class="layui-input" name="discount_rate_begin" autocomplete="off">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">折扣止</label>
<div class="layui-input-inline input-append">
<input type="number" step="0.01" class="layui-input" name="discount_rate_end" autocomplete="off">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">结算价起</label>
<div class="layui-input-inline input-append">
<input type="number" step="0.01" class="layui-input" name="price_from" autocomplete="off">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">结算价止</label>
<div class="layui-input-inline input-append">
<input type="number" step="0.01" class="layui-input" name="price_to" autocomplete="off">
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
<button type="reset" lay-submit lay-filter="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</div>
</div>
<!-- 列表 -->
<div class="goods-table-content">
<table id="listContent" lay-filter="listContent"></table>
</div>
<!-- 商品信息 -->
<script type="text/html" id="goodsInfo">
<div class="goods-info" title="{{ d.name }}">
<div class="goods-info-image">
<img class="goods-logo" layer-src src="{{d.logo}}" onerror="this.src = '{:img(\'public/static/img/default_img/head.png\')}' ">
</div>
<div class="goods-info-desc">
<div class="name">{{ d.name }}</div>
<div class="brand">
<span class="layui-badge layui-bg-orange">{{ d.brand }}</span>
</div>
</div>
</div>
</script>
<!-- 批量操作 -->
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="batch_add">批量入库</button>
</script>
<!-- 批量操作 -->
<script type="text/html" id="batchOperation">
<button class="layui-btn layui-btn-primary" lay-event="batch_add">批量入库</button>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="button-group">
{{# if(d.is_warehousing == 1){ }}
<button class="layui-btn" lay-event="refresh">刷新</button>
{{# }else{ }}
<button class="layui-btn" lay-event="add">入库</button>
{{# } }}
</div>
</script>
{/block}
{block name="script"}
<script>
var _thisIndex,table,form,editIframe,repeat_flag = false;//防重复标识;
layui.use(['form'], function() {
form = layui.form;
form.render();
// 基本参数
_thisIndex = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
// 内容获取
table = new Table({
elem: '#listContent',
url: ns.url("funengscm://shop/goods/tableGetList"),
cols: [
[
{
type: 'checkbox',
unresize: 'false',
width: '3%'
},
{align: 'left', title: '商品信息', unresize: 'false', templet: '#goodsInfo', width: 300},
{align: 'center', title: '起售价', field: 'price', unresize: 'false'},
{align: 'center', title: '起售结算价', field: 'settlementPrice', unresize: 'false'},
{
align: 'center', title: '商品利润率', field: 'profitMargin', unresize: 'false', templet: function (data) {
return `<span class="layui-badge layui-bg-blue">${data.profitMargin}</span>`;
}
},
{
align: 'center', title: '商品折扣率', field: 'discountRate', unresize: 'false', templet: function (data) {
return `<span class="layui-badge layui-bg-blue">${data.discountRate}</span>`;
}
},
{align: 'center', title: '商品分类', field: 'productCategoryList', unresize: 'false'},
{
align: 'center', title: '是否入库', field: 'is_warehousing', unresize: 'false', templet: function (data) {
if (data.is_warehousing == 1) return `<span class="layui-badge layui-bg-green">已入库</span>`;
else return `<span class="layui-badge">未入库</span>`;
}
},
{title: '操作', toolbar: '#operation', unresize: 'false', align: 'center', width: 80}
]],
toolbar: '#toolbarOperation',
bottomToolbar: "#batchOperation"
});
// 点击搜索
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
// 重置表单
form.on('submit(reset)', function(data) {
let field = {
page: 1,
goods_name: '',
cate_id: '',
brand_name: '',
discount_rate_begin: '',
discount_rate_end: '',
price_from: '',
price_to: '',
};
form.val("search_form", field);
layui.form.render();
// 刷新表格
table.reload({
page: {
curr: 1
},
where: field
});
});
// 监听工具栏操作
table.tool(function(obj) {
console.log(55555)
let data = obj.data;
let type = obj.event;
if(type === 'add' || type === 'refresh' ){
let tips = type === 'add' ? '确认将当前商品入库吗?' : '确认刷新当前商品吗,商品刷新后所有信息都将和供应链商品信息同步,包括已修改信息?';
layer.confirm(tips, function() {
layer.close();
// let loadingIndex = ns.loading('open', '正在进行处理,请耐心等待......');
$.ajax({
url: ns.url("funengscm://shop/goods/selectGoods"),
data: {
'info[id]': data.id,
is_refresh: type === 'refresh' ? 1 : 0
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
// layer.close(loadingIndex);
if (parseInt(res.code) === 0) {
layer.confirm('入库成功', {
title: '操作提示',
btn: ['返回列表', '继续操作'],
yes: function () {
layer.alert(res.message, function(index){
parent.layer.close(_thisIndex);
});
},
btn2: function () {
table.reload();
}
});
} else {
layer.msg(res.message);
}
}
});
}, function() {
layer.close();
});
}
});
/**
* 批量操作
*/
table.bottomToolbar(function (obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
var id_array = new Array();
for (i in obj.data){
if(obj.data[i].is_warehousing!=1){
id_array.push(obj.data[i].id);
}
}
switch (obj.event) {
case "batch_add":
batchAdd(id_array.toString());
break;
}
});
/**
* 批量操作
*/
table.toolbar(function (obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
var id_array = new Array();
for (i in obj.data){
if(obj.data[i].is_warehousing!=1){
id_array.push(obj.data[i].id);
}
}
switch (obj.event) {
case "batch_add":
batchAdd(id_array.toString());
break;
}
});
//商品
function batchAdd(goods_ids) {
let loadingIndex = ns.loading('open', '正在进行处理,请耐心等待......');
$.ajax({
url: ns.url("funengscm://shop/goods/selectGoods"),
data: {
'info[id]': goods_ids,
is_refresh: 0,
is_batch: 1
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.close(loadingIndex);
layer.msg(res.message);
repeat_flag = false;
layer.close(loadingIndex);
if (res.code == 0) {
table.reload();
}
}
});
}
});
</script>
{/block}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,211 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style>
.goods-info{
display: inline-flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: center;
height: 60px;
width: 100% !important;
}
.goods-info .goods-info-image{
width: 50px;
height: 50px;
margin-right: 10px;
}
.goods-info .goods-info-image .goods-logo{
width: 100% !important;
height: 100% !important;
}
.goods-info .goods-info-desc{
height: 50px;
display: inline-flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: center;
align-items: flex-start;
width: calc(100% - 65px);
}
.goods-info .goods-info-desc .name{
height: 25px;
width: 100%;
line-height: 25px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.goods-info .goods-info-desc .brand{
height: 25px;
line-height: 25px;
}
.button-group{
display: inline-flex;
}
.single-filter-box{
margin-top: 10px;
}
</style>
{/block}
{block name="main"}
<!-- 顶部内容 -->
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<div class="layui-colla-content layui-form layui-show member-form" lay-filter="search_form">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">商品名称</label>
<div class="layui-input-inline input-append">
<input type="text" class="layui-input" name="goods_name" autocomplete="off">
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
<button type="reset" lay-submit lay-filter="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</div>
</div>
<div class="single-filter-box">
<a href="{:addon_url('/ali1688/shop/goods/servicegoods')}" target="_blank" class="layui-btn layui-bg-orange" >选品广场</a>
</div>
<div class="layui-tab-content">
<!-- 列表 -->
<table id="listContent" lay-filter="listContent"></table>
</div>
<!-- 商品信息 -->
<script type="text/html" id="goodsInfo">
<div class="goods-info" title="{{ d.goods_name }}">
<div class="goods-info-image">
<img class="goods-logo" layer-src src="{{d.goods_image}}">
</div>
<div class="goods-info-desc">
<div class="name">{{ d.goods_name }}</div>
<div class="brand">
<span class="layui-badge layui-bg-orange">{{ d.goods_id }}</span>
</div>
</div>
</div>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="button-group">
<button class="layui-btn" lay-event="refresh">刷新进货价</button>
<a class="layui-btn" href="https://detail.1688.com/offer/{{d.open_offer_id}}.html" target="_blank">联系供应商</a>
</div>
</script>
{/block}
{block name="script"}
<script>
var table,form,editIframe,repeat_flag = false;//防重复标识;
layui.use(['form'], function() {
form = layui.form;
form.render();
// 内容获取
table = new Table({
elem: '#listContent',
url: ns.url("ali1688://shop/goods/lists"),
cols: [[
{type: 'checkbox', unresize: 'false', width: '3%'},
{align: 'left', title: '商品信息', unresize: 'false', templet: '#goodsInfo', width: 300},
{
align: 'center', title: '状态', field: 'goods_state', unresize: 'false',
width: 100,
templet: function (data) {
if (data.goods_state == 1) {
return '<span class="layui-badge layui-bg-green">已上架</span>';
} else {
return '<span class="layui-badge layui-bg-orange">已下架</span>';
}
}
},
{align: 'center', title: '进价', field: 'cost_price', unresize: 'false', width: 100},
{align: 'center', title: '销售价', field: 'price', unresize: 'false', width: 100},
{align: 'center', title: '库存', field: 'goods_stock', unresize: 'false', width: 150},
{align: 'center', title: '渠道', field: 'third_party_name', unresize: 'false', width: 120},
{
align: 'center', title: '入库时间', field: 'create_time', unresize: 'false',
templet: function (data) {
return ns.time_to_date(data.create_time)
}
},
{
align: 'center', title: '最近同步时间', field: 'update_time', unresize: 'false',
templet: function (data) {
return ns.time_to_date(data.create_time)
}
},
{title: '操作', toolbar: '#operation', unresize: 'false', align: 'center', width: 200}
]],
});
// 点击搜索
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
// 重置表单
form.on('submit(reset)', function(data) {
let field = {
"goods_name": "",
};
form.val("search_form", field);
layui.form.render();
// 刷新表格
table.reload({
page: {
curr: 1
},
where: field
});
});
// 监听工具栏操作
table.tool(function(obj) {
let data = obj.data;
let type = obj.event;
if(data.channel_type=='1688'){
layer.open({
type: 2,
title: '商品入库',
skin: 'layer-tips-class',
area: ['90%', '90%'],
content: ns.url("ali1688://shop/goods/putIn", {itemId: data.open_offer_id,template_id:data.template_id})
})
}else {
if(type === 'refresh'){
layer.confirm('确认刷新当前商品吗,商品刷新后所有信息都将和供应链商品信息同步,包括已修改信息?', function() {
let loadingIndex = ns.loading('open', '正在进行处理,请耐心等待......');
$.ajax({
url: ns.url("ali1688://shop/goods/selectGoods"),
data: {
'info[id]': data.goods_id,
is_refresh: 1
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.close(loadingIndex);
if (parseInt(res.code) === 0) {
let alertIndex = layer.alert(res.message, function(index){
layer.close(alertIndex);
table.reload();
});
} else {
layer.msg(res.message);
}
}
});
}, function() {
layer.close();
});
}
}
});
});
</script>
{/block}

View File

@ -0,0 +1,191 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<link rel="stylesheet" type="text/css" href="SHOP_CSS/goods_edit.css" />
<style>
.layui-form{
width: calc(100% - 40px) !important;
padding: 0 20px 30px 20px;
}
</style>
{/block}
{block name="body"}
<div class="layui-form">
{if $result.success}
<div class="layui-tab layui-tab-brief" lay-filter="goods_tab">
<ul class="layui-tab-title">
<li class="layui-this">基础设置</li>
<li>产品属性</li>
<li>SKU信息</li>
<li>商品详情</li>
<!-- <li>高级设置</li>-->
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<div class="layui-card card-common">
<div class="layui-card-header">
<span class="card-title">基础信息</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">商品名称:</label>
<div class="layui-input-inline">
<input name="goods_name" type="text" id="goods_name" value="{$result['result'][0]['productInfo']['subject']}" placeholder="请输入商品名称不能超过60个字符" maxlength="60" autocomplete="off" lay-verify="goods_name" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品主图:</label>
<div class="layui-input-block">
<div class="js-goods-image">
{foreach name="$result.result.0.productInfo.image.images" item="vo"}
<div class="item upload_img_square_item" data-index="0">
<div class="img-wrap">
<img src="{if isset($vo)} https://cbu01.alicdn.com/{$vo} {/if}" layer-src="" layer-index="0">
</div>
</div>
{/foreach}
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品类目:</label>
<div class="layui-input-inline">
<span>{$result['result'][0]['productInfo']['categoryName']}</span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">参考价格:</label>
<div class="layui-input-inline">
<span>{$result['result'][0]['productInfo']['referencePrice']}</span>
<input type="hidden" name="reference_price" value="{$result['result'][0]['productInfo']['referencePrice']}" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品类型:</label>
<div class="layui-input-inline">
<span>{$productType[$result['result'][0]['productInfo']['productType']]}</span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">业务类型:</label>
<div class="layui-input-inline">
<span>{$bizType[$result['result'][0]['productInfo']['bizType']]}</span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">质量星级:</label>
<div class="layui-input-inline">
<span>{$result['result'][0]['productInfo']['qualityLevel']}</span>
</div>
</div>
</div>
</div>
</div>
<div class="layui-tab-item">
<div class="layui-form-item">
<label class="layui-form-label">是否支持网上交易:</label>
<div class="layui-input-inline">
<span>{$result['result'][0]['productInfo']['saleInfo']['supportOnlineTrade'] == '1' ? '是' : '否'}</span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否支持混批:</label>
<div class="layui-input-inline">
<span>{$result['result'][0]['productInfo']['saleInfo']['mixWholeSale'] == '1' ? '是' : '否'}</span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">库存:</label>
<div class="layui-input-inline">
<span>{$result['result'][0]['productInfo']['saleInfo']['amountOnSale']}</span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">计量单位:</label>
<div class="layui-input-inline">
<span>{$result['result'][0]['productInfo']['saleInfo']['unit']}</span>
</div>
</div>
</div>
<div class="layui-tab-item">
<table class="layui-table">
<thead>
<tr>
<th>sku信息</th>
<th>商品码</th>
<th>库存</th>
<th>零售价</th>
<th>基准价</th>
<th>specId</th>
</tr>
</thead>
<tbody>
{if isset($result.result.0.productInfo.skuInfos)}
{foreach name="$result.result.0.productInfo.skuInfos" item="vo"}
<tr>
<td>
<img src="{if isset($vo['attributes'][0]['skuImageUrl'])} https://cbu01.alicdn.com/{$vo['attributes'][0]['skuImageUrl']} {/if}">
</td>
<td>{$vo.skuCode ?? ''}</td>
<td>{$vo.amountOnSale ?? ''}</td>
<td>{$vo.retailPrice ?? ''}</td>
<td>{$vo.consignPrice ?? ''}</td>
<td>{$vo.specId ?? ''}</td>
</tr>
{/foreach}
{/if}
</tbody>
</table>
</div>
<div class="layui-tab-item">
<div class="layui-form-item">
<label class="layui-form-label sm"></label>
<textarea name="goods_content" id="editor" placeholder="请输入内容" class="layui-textarea">{$result.result.0.productInfo.description}</textarea>
</div>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.all.js"> </script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/lang/zh-cn/zh-cn.js"></script>
</div>
<div class="layui-tab-item">5</div>
</div>
<div class="layui-inline">
<button class="layui-btn" lay-submit lay-filter="search">商品入库</button>
</div>
</div>
{else}
<div class="layui-block">
{$result.errorMsg}
</div>
{/if}
</div>
{/block}
{block name="script"}
<script>
$(function(){
UE.getEditor('editor', {
autoHeightEnabled: false,
// initialFrameWidth : 800,
initialFrameHeight : 350,
autoFloatEnabled : true,
});
})
layui.use(['form'], function() {
form = layui.form;
form.render();
// 点击搜索
form.on('submit(search)', function (data) {
$.ajax({
url: '',
data: data.field,
dataType: 'JSON',
type: 'post',
success:(res) => {
console.log(res)
layer.msg(res.message);
if(res.code == '0') setTimeout(()=>{parent.layer.closeAll()}, 3000);
}
})
});
});
</script>
{/block}

View File

@ -0,0 +1,150 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/searchable_select/searchable_select.css" />
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/extend/cascader/cascader.css"/>
<link rel="stylesheet" type="text/css" href="SHOP_CSS/goods_edit.css" />
<style>
.layui-form{
width: calc(100% - 40px) !important;
padding: 0 20px 30px 20px;
}
</style>
{/block}
{block name="body"}
<div class="layui-form">
<!-- 基础设置 -->
<div class="layui-tab-item layui-show">
<div class="layui-card card-common">
<div class="layui-card-header">
<span class="card-title">入库设置</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item goods-category-wrap">
<label class="layui-form-label"><span class="required">*</span>商品分类:</label>
<div class="layui-input-block goods-cate">
<div class="goods-category-wrap-box">
<div class="goods-category-container">
<div class="goods-category-con-wrap">
<div class="layui-block">
<div class="layui-input-inline cate-input-defalut">
<input type="text" readonly lay-verify="required" autocomplete="off" class="layui-input len-mid select-category" />
<input type="hidden" class="category_id" />
</div>
<a href="javascript:;" class="text-color js-refresh-category">刷新</a>&nbsp;
<a href="{:addon_url('shop/goodscategory/lists')}" class="text-color" target="_blank">添加分类</a>
</div>
</div>
<a href="javascript:;" class="text-color js-add-category" title="添加分类"><i class="iconfont iconjia"></i></a>
</div>
</div>
</div>
<div class="word-aux">商品可以属于多个分类最多10个</div>
</div>
</div>
{if count($template_list) > 0 }
<div class="layui-form-item">
<label class="layui-form-label">加价模板:</label>
<div class="layui-input-inline">
<select id="template_id" name="template_id" lay-filter="template">
<option value="0">选择模板</option>
{foreach $template_list as $template}
<option value="{$template['id']}">{$template['title']}</option>
{/foreach}
</select>
</div>
</div>
{/if}
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">采购模模式:</label>
<div class="layui-input-inline">
<input type="radio" name="saleType" value="normal" title="一件包邮代发" checked>
<input type="radio" name="saleType" value="batch" title="批发售卖">
</div>
</div>
<div class="word-aux">
<p>批发售卖模式,采购价部分不包邮,入库请自行设计运费模版</p>
</div>
</div>
{foreach name="$item_id" item="vo"}
<input type="hidden" name="item_id" value="{$vo}" />
{/foreach}
</div>
</div>
<div class="form-row ">
<button class="layui-btn" lay-submit lay-filter="1688save">确定</button>
</div>
</div>
{/block}
{block name="script"}
<script>
layui.extend({
layCascader: '__STATIC__/ext/layui/extend/cascader/cascader'
})
</script>
<script src="__STATIC__/ext/searchable_select/searchable_select.js"></script>
<script src="SHOP_JS/category_select.js"></script>
<script>
var repeat_flag=false; //支付宝分类
layui.use(['element', 'laytpl', 'form', 'laydate'], function () {
form = layui.form;
element = layui.element;
laytpl = layui.laytpl;
laydate = layui.laydate;
form.render();
form.on('submit(1688save)', function (data) {
var layer_index;
// 商品分类
var category_id = [];
$(".goods-cate .layui-block").each(function () {
var cate_id = $(this).find(".category_id").val();
category_id.push(cate_id);
});
if(category_id.length == 1 && category_id[0] == ''){
layer.msg("商品分类不能为空");
element.tabChange('goods_tab', "basic");
return false;
}
data.field.category_id = category_id;
var data_arr = [];
//index下标 element 当前选中的元素
$('input[name^="item_id"]').each(function(index,element){
//压入数组
data_arr[index] = $(this).val();
});
data.field.item_id = data_arr;
var template_id = $("#template_id").val();
data.field.template_id = template_id;
var url = ns.url("ali1688://shop/goods/putIns");
if (repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: url,
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function (data) {
layer.msg(data.message);
setTimeout(function () {
if (data.code == 0) {
var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
parent.location.reload();//刷新父页面注意一定要在关闭当前iframe层之前执行刷新
parent.layer.close(index); //再执行关闭
} else {
repeat_flag = false;
}
},1000)
},
beforeSend : function(){
// 显示加载中提示
layer_index = layer.load();
},
complete : function () {
// 关闭加载中提示
layer.close(layer_index);
}
});
});
});
</script>
{/block}

View File

@ -0,0 +1,335 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style>
#data_base {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-between;
}
#data_base .item{
/*height: 15em;*/
width: 14%;
margin-bottom: 15px;
font-size: 13px;
}
#data_base .item .title{
color: #00a0e9;
}
#data_base .item img{
width: 100%;
}
.item .goods-info-desc{
margin: 10px;
}
.item .goods-info-desc .title{
color: #00a0e9;
font-size:20px;
display: -webkit-box;
overflow: hidden; /* 超出部分隐藏 */
text-overflow: ellipsis; /* 显示省略号 */
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
}
.item .goods-info-desc .desc{
/*color: #00a0e9; */
}
.item .goods-info-desc .btn-box{
display: flex;
justify-content: end;
margin-top: 10px;
}
.item .goods-info-desc .serviceList{
height: 60px;
}
p{
margin-top: 10px;
}
.putIns{
margin: 5px 0 12px -10px;
display: flex;
justify-content: flex-end;
}
</style>
{/block}
{block name="main"}
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<div class="layui-colla-content layui-form layui-show" lay-filter="search_form">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">关键字:</label>
<div class="layui-input-inline">
<input type="text" name="keyword" placeholder="请输入关键字" class="layui-input">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">价格区间:</label>
<div class="layui-input-inline">
<input type="text" class="layui-input-inline layui-input" name="priceStart" autocomplete="off" placeholder="起始价格">
<div class="layui-form-mid"></div>
<input type="text" class="layui-input-inline layui-input" name="priceEnd" autocomplete="off" placeholder="终止价格">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">商品分类:</label>
<div class="layui-input-inline">
<select name="categoryId" lay-filter="category">
<option value="">请选择商品分类</option>
{foreach $category_list as $category}
<option value="{$category['id']}">{$category['name']}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">筛选规则:</label>
<div class="layui-input-block">
{foreach $ProductFilter as $Filter}
<input type="checkbox" name="filters[]" value="{$Filter.key}" title="{$Filter.desc}" >
{/foreach}
</div>
</div>
<!-- <div class="layui-form-item">-->
<!-- <div class="layui-inline">-->
<!-- <label class="layui-form-label">图片搜索:</label>-->
<!-- <div class="layui-input-inline">-->
<!-- <button class="layui-btn">选择图片</button>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
<button type="reset" lay-submit lay-filter="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</div>
</div>
<!-- 顶部内容 -->
<div class="layui-tab table-tab" >
<div class="putIns">
<button class="layui-btn" onclick="putIns()">批量入库</button>
</div>
<div class="layui-tab-content">
<div class="layui-colla-item" id="data_base"></div>
<div class="layui-colla-item" id="pages"></div>
</div>
<div class="putIns">
<button class="layui-btn" onclick="putIns()">批量入库</button>
</div>
</div>
<!-- 商品信息 -->
<script type="text/html" id="goodsInfo">
{{# for(var i=0;i<d.length;i++){ }}
<div class="item" >
<div class="goods-info-image">
<img class="goods-logo" layer-src src="{{d[i].imgUrl}}">
</div>
<div class="goods-info-desc">
<a class="title" href="https://detail.1688.com/offer/{{d[i].itemId}}.html" target="_blank">{{d[i].title}}</a>
<div class="goods-info-desc-content" data-itemId="{{d[i].itemId}}" is_warehousing="{{d[i].is_warehousing}}" onclick="check(this.getAttribute('data-itemId'),this.getAttribute('is_warehousing'))">
<div class="serviceList">
<div style="margin-top: 5px;">
{{# for(var s=0;s < d[i].serviceList.length;s++){ }}
<span class="layui-badge layui-bg-orange">{{d[i].serviceList[s].name}}</span>
{{# } }}
</div>
</div>
<div class="desc">
<p>产品id{{d[i].itemId}}</p>
<p>90天销量{{d[i].salesCnt90d}}</p>
<p>最小价:{{d[i].minPrice/100}}元</p>
<p>最大价:{{d[i].maxPrice/100}}元</p>
</div>
</div>
<div class="btn-box">
<input style="margin-right: 60%;min-height: 1%;min-width: 20px; {{d[i].is_warehousing==1 ? 'display: none' : ''}}" type="checkbox" name="putIn" value="{{d[i].itemId}}" lay-skin="switch" lay-filter="state" id="{{d[i].itemId}}" />
<button class="layui-btn" lay-event="putIn" data-itemId="{{d[i].itemId}}" onclick="putIn(this.getAttribute('data-itemId'))">{{d[i].is_warehousing==1 ? '编辑信息' : '入库'}}</button>
</div>
</div>
</div>
{{# } }}
</script>
<script type="text/html" id="ruleInfo">
<div class="layui-form">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">加价模版:</label>
<div class="layui-input-inline">
<select name="template_id" lay-filter="template">
{foreach $template_list as $template}
<option value="{$template['id']}">{$template['title']}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">采购模模式:</label>
<div class="layui-input-inline">
<input type="radio" name="saleType" value="normal" title="一件包邮代发" checked>
<input type="radio" name="saleType" value="batch" title="批发售卖">
</div>
</div>
<div class="word-aux">
<p>批发售卖模式,采购价部分不包邮,入库请自行设计运费模版</p>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="ruleInfo">确定</button>
</div>
</div>
</script>
{/block}
{block name="script"}
<script>
var repeat_flag = false,form;//防重复标识;
layui.use(['form', 'laypage', 'laytpl'], function () {
form = layui.form;
laytpl = layui.laytpl;
laypage = layui.laypage
var dataLists = []
getData();
form.render();
// 点击搜索
form.on('submit(search)', function (data) {
dataLists = data;
getData(data)
});
form.on("select(category)", function (data) {
console.log(data.value);
var thisValue = data.value;
if (thisValue == '3') {
$("#rubric").css("display", "block");
} else {
$("#rubric").css("display", "none");
}
});
var goodsInfo = $("#goodsInfo").html();
function getData(data = [], page = '1', limit = '20') {
var list = {};
if (data.field){
list = data.field
}
list['pageSize'] = limit;
list['pageNum'] = page;
$.ajax({
url: ns.url("ali1688://shop/goods/getGoodsList"),
data: list,
dataType: 'JSON',
type: 'POST',
success: function (res) {
if (res.result['success'] == true && res.result.result.length > 0) {
let d = res.result.result;
laytpl(goodsInfo).render(d, function (html) {
$('#data_base').html(html);
})
if (page == '1') {
//执行一个laypage实例
laypage.render({
elem: 'pages',
count: res.result.pageInfo.totalRecords, //数据总数,从服务端得到
limit: 20,
layout:['prev', 'page', 'next','skip'],
jump: function (obj, first) {
if (!first) {
console.log(obj.curr, obj.limit);
getData(dataLists, obj.curr, obj.limit);
}
}
});
}
} else {
$('#data_base').html(res.result.message);
// $('#data_base').html('无数据');
$('#pages').html('');
}
}
})
}
// 重置表单
form.on('submit(reset)', function (data) {
let field = {
"keyword": "",
};
form.val("search_form", field);
layui.form.render();
// 刷新表格
table.reload({
page: {
curr: 1
},
where: field
});
});
})
function check(id,is_warehousing) {
if(is_warehousing=='0'){
if ($("#" +id).prop('checked')) { //判断是否选中
$("#" +id).prop("checked", false);//正确,取消选中
} else {
$("#" +id).prop("checked", true);//正确选中
}
form.render("checkbox");//重新渲染页面checkbox控件
}
}
function putIn(itemId) {
var length = $('input[type=checkbox]:checked').length;
if (length > 0) {
putIns();
}else if (itemId) {
laytpl($('#ruleInfo').html()).render([],function(html){
let ruleInfo= layer.open({
title: '入库规则',
skin: 'layer-tips-class',
type: 1,
area: ['600px', '400px'],
content: html,
success: function () {
form.render();
form.on('submit(ruleInfo)', function(obj) {
console.log(obj.field)
layer.close(ruleInfo);
layer.open({
type: 2,
title: '商品入库',
skin: 'layer-tips-class',
area: ['90%', '90%'],
content: ns.url("ali1688://shop/goods/putIn", {itemId: itemId,...obj.field})
})
});
}
})
})
}
}
function putIns() {
var length = $('input[type=checkbox]:checked').length;
if (length > 0 && length < 11) {
var itemIds = [];
//意思是选择被选中的checkbox
$.each($('input:checkbox:checked'),function(){
itemIds.push($(this).val());
});
layer.open({
type: 2,
title: '批量入库',
skin: 'layer-tips-class',
area: ['700px', '650px'],
content: ns.url("ali1688://shop/goods/putIns", {itemId: itemIds})
})
}else if (length > 0 && length > 10) {
layer.msg('一次最多只能入库十件商品')
} else {
layer.msg('请选择要操作的数据')
}
}
</script>
{/block}

View File

@ -0,0 +1,355 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style>
.goods-table-content{
width: calc(100% - 40px) !important;
padding: 0 20px 30px 20px;
}
.goods-info{
display: inline-flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: center;
height: 60px;
width: 100% !important;
}
.goods-info .goods-info-image{
width: 50px;
height: 50px;
margin-right: 10px;
}
.goods-info .goods-info-image .goods-logo{
width: 100% !important;
height: 100% !important;
}
.goods-info .goods-info-desc{
height: 50px;
display: inline-flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: center;
align-items: flex-start;
width: calc(100% - 65px);
}
.goods-info .goods-info-desc .name{
height: 25px;
width: 100%;
line-height: 25px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.goods-info .goods-info-desc .brand{
height: 25px;
line-height: 25px;
}
.button-group{
display: inline-flex;
}
</style>
{/block}
{block name="body"}
<!-- 顶部搜索 -->
<div class="screen layui-collapse">
<div class="layui-colla-item">
<div class="layui-colla-content layui-form layui-show member-form" lay-filter="search_form">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">商品名称</label>
<div class="layui-input-inline input-append">
<input type="text" class="layui-input" name="goods_name" autocomplete="off">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">商品分类</label>
<div class="layui-input-inline">
<select name="cate_id" lay-search="">
<option value="">全部分类</option>
{foreach $cate_list as $cateKey => $cateVal}
<optgroup label="{$cateVal['name']}">
{foreach $cateVal['children'] as $cateChildrenKey => $cateChildrenVal}
<option value="{$cateChildrenVal['id']}">{$cateChildrenVal['name']}</option>
{/foreach}
</optgroup>
{/foreach}
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">品牌</label>
<div class="layui-input-inline">
<select name="brand_name" lay-search="">
<option value="">全部品牌</option>
{foreach $brand_list as $brandKey => $brandVal}
<option value="{$brandVal['name']}">{$brandVal['name']}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">折扣起</label>
<div class="layui-input-inline input-append">
<input type="number" step="0.01" class="layui-input" name="discount_rate_begin" autocomplete="off">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">折扣止</label>
<div class="layui-input-inline input-append">
<input type="number" step="0.01" class="layui-input" name="discount_rate_end" autocomplete="off">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">结算价起</label>
<div class="layui-input-inline input-append">
<input type="number" step="0.01" class="layui-input" name="price_from" autocomplete="off">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">结算价止</label>
<div class="layui-input-inline input-append">
<input type="number" step="0.01" class="layui-input" name="price_to" autocomplete="off">
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
<button type="reset" lay-submit lay-filter="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</div>
</div>
<!-- 列表 -->
<div class="goods-table-content">
<table id="listContent" lay-filter="listContent"></table>
</div>
<!-- 商品信息 -->
<script type="text/html" id="goodsInfo">
<div class="goods-info" title="{{ d.name }}">
<div class="goods-info-image">
<img class="goods-logo" layer-src src="{{d.logo}}" onerror="this.src = '{:img(\'public/static/img/default_img/head.png\')}' ">
</div>
<div class="goods-info-desc">
<div class="name">{{ d.name }}</div>
<div class="brand">
<span class="layui-badge layui-bg-orange">{{ d.brand }}</span>
</div>
</div>
</div>
</script>
<!-- 批量操作 -->
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="batch_add">批量入库</button>
</script>
<!-- 批量操作 -->
<script type="text/html" id="batchOperation">
<button class="layui-btn layui-btn-primary" lay-event="batch_add">批量入库</button>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="button-group">
{{# if(d.is_warehousing == 1){ }}
<button class="layui-btn" lay-event="refresh">刷新</button>
{{# }else{ }}
<button class="layui-btn" lay-event="add">入库</button>
{{# } }}
</div>
</script>
{/block}
{block name="script"}
<script>
var _thisIndex,table,form,editIframe,repeat_flag = false;//防重复标识;
layui.use(['form'], function() {
form = layui.form;
form.render();
// 基本参数
_thisIndex = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
// 内容获取
table = new Table({
elem: '#listContent',
url: ns.url("funengscm://shop/goods/tableGetList"),
cols: [
[
{
type: 'checkbox',
unresize: 'false',
width: '3%'
},
{align: 'left', title: '商品信息', unresize: 'false', templet: '#goodsInfo', width: 300},
{align: 'center', title: '起售价', field: 'price', unresize: 'false'},
{align: 'center', title: '起售结算价', field: 'settlementPrice', unresize: 'false'},
{
align: 'center', title: '商品利润率', field: 'profitMargin', unresize: 'false', templet: function (data) {
return `<span class="layui-badge layui-bg-blue">${data.profitMargin}</span>`;
}
},
{
align: 'center', title: '商品折扣率', field: 'discountRate', unresize: 'false', templet: function (data) {
return `<span class="layui-badge layui-bg-blue">${data.discountRate}</span>`;
}
},
{align: 'center', title: '商品分类', field: 'productCategoryList', unresize: 'false'},
{
align: 'center', title: '是否入库', field: 'is_warehousing', unresize: 'false', templet: function (data) {
if (data.is_warehousing == 1) return `<span class="layui-badge layui-bg-green">已入库</span>`;
else return `<span class="layui-badge">未入库</span>`;
}
},
{title: '操作', toolbar: '#operation', unresize: 'false', align: 'center', width: 80}
]],
toolbar: '#toolbarOperation',
bottomToolbar: "#batchOperation"
});
// 点击搜索
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
// 重置表单
form.on('submit(reset)', function(data) {
let field = {
page: 1,
goods_name: '',
cate_id: '',
brand_name: '',
discount_rate_begin: '',
discount_rate_end: '',
price_from: '',
price_to: '',
};
form.val("search_form", field);
layui.form.render();
// 刷新表格
table.reload({
page: {
curr: 1
},
where: field
});
});
// 监听工具栏操作
table.tool(function(obj) {
console.log(55555)
let data = obj.data;
let type = obj.event;
if(type === 'add' || type === 'refresh' ){
let tips = type === 'add' ? '确认将当前商品入库吗?' : '确认刷新当前商品吗,商品刷新后所有信息都将和供应链商品信息同步,包括已修改信息?';
layer.confirm(tips, function() {
layer.close();
// let loadingIndex = ns.loading('open', '正在进行处理,请耐心等待......');
$.ajax({
url: ns.url("funengscm://shop/goods/selectGoods"),
data: {
'info[id]': data.id,
is_refresh: type === 'refresh' ? 1 : 0
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
// layer.close(loadingIndex);
if (parseInt(res.code) === 0) {
layer.confirm('入库成功', {
title: '操作提示',
btn: ['返回列表', '继续操作'],
yes: function () {
layer.alert(res.message, function(index){
parent.layer.close(_thisIndex);
});
},
btn2: function () {
table.reload();
}
});
} else {
layer.msg(res.message);
}
}
});
}, function() {
layer.close();
});
}
});
/**
* 批量操作
*/
table.bottomToolbar(function (obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
var id_array = new Array();
for (i in obj.data){
if(obj.data[i].is_warehousing!=1){
id_array.push(obj.data[i].id);
}
}
switch (obj.event) {
case "batch_add":
batchAdd(id_array.toString());
break;
}
});
/**
* 批量操作
*/
table.toolbar(function (obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
var id_array = new Array();
for (i in obj.data){
if(obj.data[i].is_warehousing!=1){
id_array.push(obj.data[i].id);
}
}
switch (obj.event) {
case "batch_add":
batchAdd(id_array.toString());
break;
}
});
//商品
function batchAdd(goods_ids) {
let loadingIndex = ns.loading('open', '正在进行处理,请耐心等待......');
$.ajax({
url: ns.url("funengscm://shop/goods/selectGoods"),
data: {
'info[id]': goods_ids,
is_refresh: 0,
is_batch: 1
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.close(loadingIndex);
layer.msg(res.message);
repeat_flag = false;
layer.close(loadingIndex);
if (res.code == 0) {
table.reload();
}
}
});
}
});
</script>
{/block}

View File

@ -0,0 +1,364 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style>
.goods-info{
display: inline-flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: center;
height: 60px;
width: 100% !important;
}
.goods-info .goods-info-image{
width: 50px;
height: 50px;
margin-right: 10px;
}
.goods-info .goods-info-image .goods-logo{
width: 100% !important;
height: 100% !important;
}
.goods-info .goods-info-desc{
height: 50px;
display: inline-flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: center;
align-items: flex-start;
width: calc(100% - 65px);
}
.goods-info .goods-info-desc .name{
height: 25px;
width: 100%;
line-height: 25px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.goods-info .goods-info-desc .brand{
height: 25px;
line-height: 25px;
}
.button-group{
display: inline-flex;
}
</style>
{/block}
{block name="main"}
<!-- 顶部内容 -->
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<div class="layui-colla-content layui-form layui-show member-form" lay-filter="search_form">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">订单编号</label>
<div class="layui-input-inline input-append">
<input type="text" class="layui-input" name="order_no" autocomplete="off">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">供应链ID</label>
<div class="layui-input-inline input-append">
<input type="text" class="layui-input" name="result_id" autocomplete="off">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">订单状态</label>
<div class="layui-input-inline input-append">
<select name="status">
<option value="">全部</option>
<option value="-1">待下单</option>
<option value="0">下单失败</option>
<option value="1">下单成功</option>
</select>
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
<button type="reset" lay-submit lay-filter="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</div>
</div>
<!-- 列表 -->
<table id="listContent" lay-filter="listContent"></table>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="button-group">
{{# if(d.three_pay_status == 0&& d.status == 1&& d.order_status >= 0){ }}
<button class="layui-btn" lay-event="NopassPay">免密支付</button>
<button class="layui-btn" lay-event="OnlinePay">在线支付</button>
{{# } }}
{{# if(d.status == -1){ }}
<!--待下单-->
<button class="layui-btn" lay-event="reorder">手动下单</button>
{{# }else if(d.status == 0){ }}
<!--下单失败-->
<button class="layui-btn" lay-event="reorder">重新下单</button>
<button class="layui-btn" lay-event="view_reason">查看原因</button>
{{# }else if(d.order_status >= 0){ }}
<button class="layui-btn" lay-event="cancelOrder">取消订单</button>
{{# } }}
<button class="layui-btn" lay-event="see_sub_order">查看订单商品</button>
</div>
</script>
<script type="text/html" id="pay">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span>订单金额:</label>
<div class="layui-input-block">
<div>{{d.order_money}}</div>
</div>
</div>
<div class="form-row mid">
<button class="layui-btn bg-color" onclick="window.open('{{d.payUrl}}')">去支付</button>
<button class="layui-btn layui-btn-primary" onclick="closeWin()">返回</button>
</div>
</div>
</script>
<script type="text/html" id="cancelOrder">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span>订单金额:</label>
<div class="layui-input-block">
<div>{{d.result_total_pay}}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">取消原因:</label>
<div class="layui-input-inline">
<textarea class="layui-textarea len-long" name="cancelReason" maxlength="100" lay-verify="introduction" placeholder="请输入取消订单原因"></textarea>
</div>
</div>
<div class="form-row mid">
<button class="layui-btn bg-color" lay-submit lay-filter="cancelOrder">确认取消</button>
<button class="layui-btn layui-btn-primary" onclick="closeWin()">返回</button>
</div>
<input type="hidden" name="site_id" value="{{d.site_id}}"/>
<input type="hidden" name="order_id" value="{{d.order_id}}"/>
</div>
</script>
{/block}
{block name="script"}
<script>
var table,form,editIframe,repeat_flag = false,layer_winows;//防重复标识;
layui.use(['form', 'laytpl'], function() {
form = layui.form;
laytpl = layui.laytpl;
form.render();
window.order_id = '';
// 内容获取
table = new Table({
elem: '#listContent',
url: ns.url("ali1688://shop/order/lists"),
cols: [[
{align: 'center', title: 'ID',field: 'order_id', unresize: 'false',width: 90},
{align: 'center', title: '订单编号', field: 'order_no', unresize: 'true', width: 200},
{align: 'center', title: '供订单ID', field: 'third_order', unresize: 'true',width: 200},
{align: 'center', title: '买家支付', field: 'pay_status', unresize: 'false',width: 90,templet: function (data) {
if(parseInt(data.pay_status) === 0) return `<span class="layui-badge layui-bg-reg">待支付</span>`;
else if(parseInt(data.pay_status) === 1) return `<span class="layui-badge layui-bg-green">已支付</span>`;
}},
{
align: 'center', title: '采购状态', field: 'status', unresize: 'false',width: 90, templet: function (data) {
if(parseInt(data.status) === -1) return `<span class="layui-badge layui-bg-blue">待下单</span>`;
else if(parseInt(data.status) === 0) return `<span class="layui-badge">下单失败</span>`;
else if(parseInt(data.status) === 1) return `<span class="layui-badge layui-bg-green">下单成功</span>`;
}
},
{align: 'center', title: '订单状态', field: 'order_status', unresize: 'false',width: 90,templet: function (data) {
if(parseInt(data.order_status) === 0&&parseInt(data.status) === 1&&parseInt(data.three_pay_status) === 0) return `<span class="layui-badge layui-bg-blue">已下单</span>`;
if(parseInt(data.order_status) === 0&&parseInt(data.status) === 1) return `<span class="layui-badge layui-bg-blue">待发货</span>`;
else if(parseInt(data.order_status) === 1&&parseInt(data.status) === 1) return `<span class="layui-badge layui-bg-green">已发货</span>`;
else if(parseInt(data.order_status) === 2&&parseInt(data.status) === 1) return `<span class="layui-badge layui-bg-green">部分发货</span>`;
else if(parseInt(data.order_status) === 10&&parseInt(data.status) === 1) return `<span class="layui-badge layui-bg-green">已完成</span>`;
else return `<span class="layui-badge layui-bg-green">未下单</span>`;
}},
{align: 'center', title: '采购金额', field: 'cost_price', unresize: 'false',width: 90},
{align: 'center', title: '采金支付', field: 'cost_price', unresize: 'false',width: 90,templet: function (data) {
if(parseInt(data.three_pay_status) === 0) return `<span class="layui-badge layui-bg-reg">待支付</span>`;
else if(parseInt(data.three_pay_status) === 1) return `<span class="layui-badge layui-bg-green">已支付</span>`;
}},
{align: 'center', title: '总金额(含递费)', field: 'result_total_pay', unresize: 'false',width: 150},
{align: 'center', title: '创建时间', field: 'create_time', unresize: 'false',width: 180,
templet: function (data) {
return ns.time_to_date(data.create_time);
}
},
// {align: 'center', title: '支付时间', field: 'pay_time', unresize: 'false',width: 160,templet: function (data) {
// return ns.time_to_date(data.pay_time);
// }},
{title: '操作', toolbar: '#operation', unresize: 'false', align: 'center', width: 250}
]],
});
form.on('submit(cancelOrder)', function (data) {
if (repeat_flag) return false;
repeat_flag = true;
$.ajax({
type: "POST",
dataType: 'JSON',
url: ns.url("ali1688://shop/order/cancelOrder"),
data: data.field,
success: function (res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
layer.close(layer_winows);
table.reload();
}
}
});
});
// 点击搜索
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
// 重置表单
form.on('submit(reset)', function(data) {
let field = {
"order_no": "",
"result_id": "",
"status": "",
};
form.val("search_form", field);
layui.form.render();
// 刷新表格
table.reload({
page: {
curr: 1
},
where: field
});
});
// 监听工具栏操作
table.tool(function(obj) {
let data = obj.data;
console.log(data);
let type = obj.event;
let confirmIndex;
switch (type) {
case 'cancelOrder':
laytpl($("#cancelOrder").html()).render(data, function(html) {
layer_winows = layer.open({
title: '取消订单',
type: 1,
area: ['720px','360px'],
content: html,
});
});
break;
case 'NopassPay':// 免密支付
confirmIndex = layer.confirm('确认支付吗?系统会自动扣款', function () {
layer.close(confirmIndex);
let loadingIndex = ns.loading('open', '正在进行处理,请耐心等待......');
$.ajax({
url: ns.url("ali1688://shop/order/buyPay"),
data: {
id: data.id,
order_id: data.order_id,
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.close(loadingIndex);
if (parseInt(res.code) === 0) {
let alertIndex = layer.alert(res.message, function (index) {
layer.close(alertIndex);
table.reload();
});
} else {
layer.msg(res.message);
}
}
});
}, function () {
layer.close(confirmIndex);
});
break;
case 'OnlinePay':
$.ajax({
url: ns.url("ali1688://shop/order/onlinePay"),
data: {
id: data.id,
order_id: data.order_id,
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
console.log(res);
if (parseInt(res.code) === 0) {
laytpl($("#pay").html()).render(res.data, function(html) {
layer_winows = layer.open({
title: '在线支付',
type: 1,
area: ['398px','180px'],
content: html,
});
});
} else {
layer.msg(res.message);
}
}
});
break;
case 'reorder':
confirmIndex = layer.confirm('确认重新下单吗?', function () {
layer.close(confirmIndex);
let loadingIndex = ns.loading('open', '正在进行处理,请耐心等待......');
$.ajax({
url: ns.url("ali1688://shop/order/reorder"),
data: {
order_id: data.order_id,
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.close(loadingIndex);
if (parseInt(res.code) === 0) {
let alertIndex = layer.alert(res.message, function (index) {
layer.close(alertIndex);
table.reload();
});
} else {
layer.msg(res.message);
}
}
});
}, function () {
layer.close(confirmIndex);
});
break;
// 查看原因
case 'view_reason':
layer.alert(data.reason_failure);
break;
// 查看子订单
case 'see_sub_order':
editIframe = layer.open({
type: 2,
title: '查看订单商品',
skin: 'layer-tips-class',
area: ['85%', '90%'],
content: ns.url("ali1688://shop/order/seeSubOrder", {order_id: data.order_id}),
end: function () {
// table.reload();
}
});
break;
}
});
});
function closeWin() {
layer.close(layer_winows);
}
</script>
{/block}

View File

@ -0,0 +1,170 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style>
.goods-table-content{
width: calc(100% - 40px) !important;
padding: 0 20px 30px 20px;
}
.goods-info{
display: inline-flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: center;
height: 60px;
width: 100% !important;
}
.goods-info .goods-info-image{
width: 50px;
height: 50px;
margin-right: 10px;
}
.goods-info .goods-info-image .goods-logo{
width: 100% !important;
height: 100% !important;
}
.goods-info .goods-info-desc{
height: 50px;
display: inline-flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: center;
align-items: flex-start;
width: calc(100% - 65px);
}
.goods-info .goods-info-desc .name{
height: 25px;
width: 100%;
line-height: 25px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.goods-info .goods-info-desc .brand{
height: 25px;
line-height: 25px;
}
.button-group{
display: inline-flex;
}
</style>
{/block}
{block name="body"}
<!-- 列表 -->
<div class="goods-table-content">
<table id="listContent" lay-filter="listContent"></table>
</div>
<!-- 商品信息 -->
<script type="text/html" id="goodsInfo">
<div class="goods-info" title="{{ d.name }}">
<div class="goods-info-image">
<img class="goods-logo" layer-src src="{{d.sku_image}}" onerror="this.src = '{:img(\'public/static/img/default_img/head.png\')}' ">
</div>
<div class="goods-info-desc">
<div class="name">{{ d.sku_name }}</div>
{{# if(d.sku_no){ }}
<div class="brand">
<span class="layui-badge layui-bg-orange">规格编码:{{ d.sku_no }}</span>
</div>
{{# } }}
</div>
</div>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="button-group">
<!--请求结果:订单物流状态 1 待发货 2 已发货 3 已签收 4 拒收 5 已退款 6 申请退款 7 同意申请 8 拒绝申请-->
{{# if(d.result_express_status == 1 || d.result_express_status == 2 || d.result_express_status == 3 || d.result_express_status == 4){ }}
<button class="layui-btn" lay-event="clickRefund">退款</button>
{{# }else{ }}
<a class="layui-btn" href="https://detail.1688.com/offer/{{d.result_id}}.html" target="_blank">联系供应商</a>
{{# } }}
</div>
</script>
{/block}
{block name="script"}
<script>
let order_id = "{$order_id}";
var _thisIndex,table,form,editIframe,repeat_flag = false;//防重复标识;
layui.use(['form'], function() {
form = layui.form;
form.render();
// 基本参数
_thisIndex = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
// 内容获取
table = new Table({
elem: '#listContent',
url: ns.url("ali1688://shop/order/seeSubOrder", { order_id: order_id }),
cols: [[
{align: 'left', title: '商品信息', unresize: 'false', templet: '#goodsInfo', width: 350},
{align: 'center', title: '快递公司', field: 'result_express_company', unresize: 'false'},
{align: 'center', title: '快递单号', field: 'result_express_number', unresize: 'false'},
// {align: 'center', title: '发货时间', field: 'result_express_time', unresize: 'false'},
{
align: 'center', title: '状态', field: 'result_express_status', unresize: 'false', templet: function (data) {
// 请求结果:订单物流状态 1 待发货 2 已发货 3 已签收 4 拒收 5 已退款 6 申请退款 7 同意申请 8 拒绝申请
switch (parseInt(data.result_express_status)){
case 0: return '<span class="layui-badge layui-bg-gray">未下单</span>';break;
case 1: return '<span class="layui-badge layui-bg-gray">待发货</span>';break;
case 2: return '<span class="layui-badge layui-bg-blue">已发货</span>';break;
case 3: return '<span class="layui-badge layui-bg-blue">已签收</span>';break;
case 4: return '<span class="layui-badge">拒收</span>';break;
case 5: return '<span class="layui-badge">已退款</span>';break;
case 6: return '<span class="layui-badge layui-bg-orange">申请退款</span>';break;
case 7: return '<span class="layui-badge layui-bg-green">同意申请</span>';break;
case 8: return '<span class="layui-badge">拒绝申请</span>';break;
}
}
},
{align: 'center', title: '结算价格', field: 'result_price', unresize: 'false'},
{align: 'center', title: '购买数量', field: 'result_quantity', unresize: 'false'},
{align: 'center', title: '卖家备注', field: 'result_seller_remarks', unresize: 'false'},
{title: '操作', toolbar: '#operation', unresize: 'false', align: 'center', width: 80}
]],
});
// 监听工具栏操作
table.tool(function(obj) {
let data = obj.data;
let type = obj.event;
switch (type) {
case 'see':
break;
case 'clickRefund':
let confirmIndex = layer.confirm('确认进行退款申请吗?', function() {
layer.close(confirmIndex);
let loadingIndex = ns.loading('open', '正在进行处理,请耐心等待......');
$.ajax({
url: ns.url("ali1688://shop/order/subOrderRefund"),
data: {
'info[sub_order_id]': data.id,
'info[order_goods_id]': data.order_goods_id,
'info[order_id]': data.order_id,
'info[sku_no]': data.sku_no,
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.close(loadingIndex);
if (parseInt(res.code) === 0) {
let alertIndex = layer.alert(res.message, function(index){
// parent.layer.close(_thisIndex);
table.reload();
layer.close(alertIndex);
});
} else {
table.reload();
layer.msg(res.message);
}
}
});
}, function() {
layer.close();
});
break;
}
});
});
</script>
{/block}

View File

@ -0,0 +1,40 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>授权通知</title>
<script src="__STATIC__/ext/layui/layui.js"></script>
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/css/layui.css" />
</head>
<body>
<div class="container">
<div><img style='width: 200px;align-content: center;' src='/addon/aliapp/shop/view/public/{$img}.png'></div>
<div style= "font-size:60px;margin-top: 25px">{$desc}</div>
<form class="layui-form" action="">
<div class="layui-form-item">
<!-- <button type="button" class="layui-btn layui-btn-normal" onclick="close()" style="margin-top: 100px;font-size: 50px;height:90px;">关闭页面</button>-->
</div>
</form>
</div>
</body>
<style>
.container {
/*margin-top: 50px;*/
text-align: center;
margin: 100px auto;
}
.item{
display: inline-block;
width: 100px;
background-color: #ff266e;
}
</style>
<script>
function close() {
window.opener=null;
window.open(location, '_self').close();
}
</script>
</html>

View File

@ -0,0 +1,217 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<link rel="stylesheet" href="__STATIC__/element-ui/index.css">
<style>
#container{ width: 650px; height: 500px; }
#container > div {z-index: 500!important}
.empty-address{ display: none; }
.address-content {display: inline-block;vertical-align: top;}
.form-wrap {margin-top: 0;}
.empty-address-text{font-size: 14px;color: #f43530;height: 34px;line-height: 34px;}
.upload_img_square {border-radius: 0}
</style>
{/block}
{block name="main"}
<div class="layui-form form-wrap" lay-filter="editselffetch">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>模板标题:</label>
<div class="layui-input-block">
<input type="text" name="title" autocomplete="off" lay-verify="required" class="layui-input len-long">
</div>
<div class="word-aux">例如加价20%模板</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">价格设置:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<span>价格 = 1688价格 *</span>
</div>
<div class="layui-input-inline" style="width: 100px;">
<input type="number" name="price_set[multiple]" placeholder="增价百分百" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid">+</div>
<div class="layui-input-inline" style="width: 100px;">
<input type="number" name="price_set[increase]" placeholder="递增数" autocomplete="off" class="layui-input">
</div>
</div>
<div class="word-aux">提示:百分百和递增数可以不填或只填一个;优先按百分百增长</div>
</div>
<div class="layui-form-item label-list">
<label class="layui-form-label"><span class="required"></span>商品名称设置:</label>
<div class="layui-input-block layui-form-pane">
<div class="layui-inline">
<label class="layui-form-label" style="height: 34px">添加前缀:</label>
<div class="layui-input-inline">
<input type="text" name="title_set[prefix]" class="layui-input len-long" placeholder="">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label" style="height: 34px">添加后缀:</label>
<div class="layui-input-inline">
<input type="text" name="title_set[suffix]" class="layui-input len-long" placeholder="">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label" style="height: 34px">删除关键字:</label>
<div class="layui-input-inline">
<input type="text" name="title_set[delete_keywords]" class="layui-input len-long" placeholder="">
</div>
</div>
<div class="layui-form-item title_set">
<label class="layui-form-mid">替换关键字:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="text" name="title_set[replace_keywords][before][]" placeholder="非必填" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid">替换为</div>
<div class="layui-input-inline">
<input type="text" name="title_set[replace_keywords][after][]" placeholder="非必填" autocomplete="off" class="layui-input">
</div>
<button class="layui-btn layui-btn-warm delSet">
<i class="layui-icon">&#xe640;</i>
</button>
</div>
</div>
<div class="layui-input-block" onclick="addSet('title_set')">
<button class="layui-btn">
<i class="layui-icon">&#xe654;</i> 添加替换关键字
</button>
</div>
</div>
</div>
<div class="layui-form-item label-list">
<label class="layui-form-label"><span class="required"></span>SKU设置</label>
<div class="layui-input-block layui-form-pane">
<div class="layui-inline">
<label class="layui-form-label" style="height: 34px">添加前缀:</label>
<div class="layui-input-inline">
<input type="text" name="sku_set[prefix]" class="layui-input len-long" placeholder="">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label" style="height: 34px">添加后缀:</label>
<div class="layui-input-inline">
<input type="text" name="sku_set[suffix]" class="layui-input len-long" placeholder="">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label" style="height: 34px">删除关键字:</label>
<div class="layui-input-inline">
<input type="text" name="sku_set[delete_keywords]" class="layui-input len-long" placeholder="">
</div>
</div>
<div class="layui-form-item sku_set">
<label class="layui-form-mid">替换关键字:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="text" name="sku_set[replace_keywords][before][]" placeholder="非必填" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid">替换为</div>
<div class="layui-input-inline">
<input type="text" name="sku_set[replace_keywords][after][]" placeholder="非必填" autocomplete="off" class="layui-input">
</div>
<button class="layui-btn layui-btn-warm delSet">
<i class="layui-icon">&#xe640;</i>
</button>
</div>
</div>
<div class="layui-input-block" onclick="addSet('sku_set')">
<button class="layui-btn">
<i class="layui-icon">&#xe654;</i> 添加替换关键字
</button>
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
<a id="storeImage"></a>
</div>
</div>
{/block}
{block name="script"}
<script type="text/html" id="storeImageTpl">
{{# if(d.list.length){ }}
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="item upload_img_square_item" data-index="{{i}}">
<div class="img-wrap">
<img src="{{ns.img(d.list[i],'small')}}" layer-src>
</div>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
<div class="replace_img" data-index="{{i}}">点击替换</div>
</div>
</div>
{{# } }}
{{# if(d.list.length < d.max){ }}
<div class="item js-add-image upload_img_square">+</div>
{{# } }}
{{# }else{ }}
<div class="item js-add-image upload_img_square">+</div>
{{# } }}
</script>
<script src="SHOP_JS/category_select.js"></script>
<script src="STATIC_JS/vue.js"></script>
<!-- 引入组件库 -->
<script src="__STATIC__/element-ui/index.js"></script>
<script>
var form, repeat_flag, map_class, laytpl;
var saveData = null;
var totalUploadNum = 0;
var completeUploadNum = 0;
var alipaycategory_id = '';
$(document).on('click', '.delSet',function(){
$(this).parent().remove();
})
layui.use(['form', 'laydate', 'laytpl'], function () {
form = layui.form;
repeat_flag = false;//防重复标识
laytpl = layui.laytpl;
form.render();
form.on('submit(save)', function (data) {
console.log(data)
var url = ns.url("ali1688://shop/template/add");
repeat_flag = true;
$.ajax({
url: url,
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function (data) {
layer.msg(data.message);
if (data.code == 0) {
location.href = ns.url("ali1688://shop/template/lists");
} else {
repeat_flag = false;
}
}
});
});
})
function addSet(type) {
html = '';
html += '<div class="layui-input-block">';
html += '<div class="layui-input-inline">';
html += '<input type="text" name="' + type + '[replace_keywords][before][]" placeholder="非必填" autocomplete="off" class="layui-input">';
html += '</div>';
html += '<div class="layui-form-mid">替换为</div>';
html += '<div class="layui-input-inline">';
html += '<input type="text" name="' + type + '[replace_keywords][after][]" placeholder="非必填" autocomplete="off" class="layui-input">';
html += '</div>';
html += '<button class="layui-btn layui-btn-warm delSet">';
html += '<i class="layui-icon">&#xe640;</i>';
html += '</button>';
html += '</div>';
console.log(html)
$("." + type + "").append(html);
}
function back()
{
window.history.back();
}
</script>
{/block}

View File

@ -0,0 +1,233 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<link rel="stylesheet" href="__STATIC__/element-ui/index.css">
<style>
#container{ width: 650px; height: 500px; }
#container > div {z-index: 500!important}
.empty-address{ display: none; }
.address-content {display: inline-block;vertical-align: top;}
.form-wrap {margin-top: 0;}
.empty-address-text{font-size: 14px;color: #f43530;height: 34px;line-height: 34px;}
.upload_img_square {border-radius: 0}
</style>
{/block}
{block name="main"}
<div class="layui-form form-wrap" lay-filter="editselffetch">
<input type="hidden" name="id" value="{$data.id}"/>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>模板标题:</label>
<div class="layui-input-block">
<input type="text" name="title" autocomplete="off" value="{$data.title}" lay-verify="required" class="layui-input len-long">
</div>
<div class="word-aux">例如加价20%模板</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">价格设置:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<span>价格 = 1688进价 *</span>
</div>
<div class="layui-input-inline" style="width: 100px;">
<input type="number" name="price_set[multiple]" placeholder="增价百分百" autocomplete="off" class="layui-input" value="{$data.price_set['multiple']}">
</div>
<div class="layui-form-mid"></div>
<div class="layui-input-inline" style="width: 100px;">
<input type="number" name="price_set[increase]" placeholder="递增数" autocomplete="off" class="layui-input" value="{$data.price_set['increase']}">
</div>
</div>
<div class="word-aux">提示:百分百和递增数可以不填或只填一个;优先按百分百增长</div>
</div>
<div class="layui-form-item label-list">
<label class="layui-form-label"><span class="required"></span>商品名称设置:</label>
<div class="layui-input-block layui-form-pane">
<div class="layui-inline">
<label class="layui-form-label" style="height: 34px">添加前缀:</label>
<div class="layui-input-inline">
<input type="text" name="title_set[prefix]" class="layui-input len-long" placeholder="" value="{$data.title_set.prefix ?? ''}">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label" style="height: 34px">添加后缀:</label>
<div class="layui-input-inline">
<input type="text" name="title_set[suffix]" class="layui-input len-long" placeholder="" value="{$data.title_set.suffix ?? ''}">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label" style="height: 34px">删除关键字:</label>
<div class="layui-input-inline">
<input type="text" name="title_set[delete_keywords]" class="layui-input len-long" placeholder="" value="{$data.title_set.delete_keywords ?? ''}">
</div>
</div>
<div class="layui-form-item title_set">
<label class="layui-form-mid">替换关键字:</label>
{if isset($data['title_set']['replace_keywords']['before'])}
{foreach $data['title_set']['replace_keywords']['before'] as $key=>$val}
{if $val}
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="text" name="title_set[replace_keywords][before][]" value="{$val}" placeholder="非必填" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid">替换为</div>
<div class="layui-input-inline">
<input type="text" name="title_set[replace_keywords][after][]" value="{$data['title_set']['replace_keywords']['after'][$key]}" placeholder="非必填" autocomplete="off" class="layui-input">
</div>
<button class="layui-btn layui-btn-warm delSet">
<i class="layui-icon">&#xe640;</i>
</button>
</div>
{/if}
{/foreach}
{/if}
</div>
<div class="layui-input-block" onclick="addSet('title_set')">
<button class="layui-btn">
<i class="layui-icon">&#xe654;</i> 添加替换关键字
</button>
</div>
</div>
</div>
<div class="layui-form-item label-list">
<label class="layui-form-label"><span class="required"></span>SKU设置</label>
<div class="layui-input-block layui-form-pane">
<div class="layui-inline">
<label class="layui-form-label" style="height: 34px">添加前缀:</label>
<div class="layui-input-inline">
<input type="text" name="sku_set[prefix]" class="layui-input len-long" placeholder="" value="{$data.sku_set.prefix ?? ''}">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label" style="height: 34px">添加后缀:</label>
<div class="layui-input-inline">
<input type="text" name="sku_set[suffix]" class="layui-input len-long" placeholder="" value="{$data.sku_set.suffix ?? ''}">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label" style="height: 34px">删除关键字:</label>
<div class="layui-input-inline">
<input type="text" name="sku_set[delete_keywords]" class="layui-input len-long" placeholder="" value="{$data.sku_set.delete_keywords ?? ''}">
</div>
</div>
<div class="layui-form-item sku_set">
<label class="layui-form-mid">替换关键字:</label>
{if isset($data['sku_set']['replace_keywords']['before'])}
{foreach $data['sku_set']['replace_keywords']['before'] as $key=>$val}
{if $val}
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="text" name="sku_set[replace_keywords][before][]" value="{$val}" placeholder="非必填" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid">替换为</div>
<div class="layui-input-inline">
<input type="text" name="sku_set[replace_keywords][after][]" value="{$data['sku_set']['replace_keywords']['after'][$key]}" placeholder="非必填" autocomplete="off" class="layui-input">
</div>
<button class="layui-btn layui-btn-warm delSet">
<i class="layui-icon">&#xe640;</i>
</button>
</div>
{/if}
{/foreach}
{/if}
</div>
<div class="layui-input-block" onclick="addSet('sku_set')">
<button class="layui-btn">
<i class="layui-icon">&#xe654;</i> 添加替换关键字
</button>
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
<a id="storeImage"></a>
</div>
</div>
{/block}
{block name="script"}
<script type="text/html" id="storeImageTpl">
{{# if(d.list.length){ }}
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="item upload_img_square_item" data-index="{{i}}">
<div class="img-wrap">
<img src="{{ns.img(d.list[i],'small')}}" layer-src>
</div>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
<div class="replace_img" data-index="{{i}}">点击替换</div>
</div>
</div>
{{# } }}
{{# if(d.list.length < d.max){ }}
<div class="item js-add-image upload_img_square">+</div>
{{# } }}
{{# }else{ }}
<div class="item js-add-image upload_img_square">+</div>
{{# } }}
</script>
<script src="SHOP_JS/category_select.js"></script>
<script src="STATIC_JS/vue.js"></script>
<!-- 引入组件库 -->
<script src="__STATIC__/element-ui/index.js"></script>
<script>
var form, repeat_flag, map_class, laytpl;
var saveData = null;
var totalUploadNum = 0;
var completeUploadNum = 0;
var alipaycategory_id = '{$data.alipaycategory_id}';
$(document).on('click', '.delSet',function(){
$(this).parent().remove();
})
layui.use(['form', 'laydate', 'laytpl'], function () {
form = layui.form;
repeat_flag = false;//防重复标识
laytpl = layui.laytpl;
form.render();
form.on('submit(save)', function (data) {
console.log(data)
var url = ns.url("ali1688://shop/template/edit");
repeat_flag = true;
$.ajax({
url: url,
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function (data) {
layer.msg(data.message);
if (data.code == 0) {
location.href = ns.url("ali1688://shop/template/lists");
} else {
repeat_flag = false;
}
}
});
});
})
function addSet(type) {
html = '';
html += '<div class="layui-input-block">';
html += '<div class="layui-input-inline">';
html += '<input type="text" name="' + type + '[replace_keywords][before][]" placeholder="非必填" autocomplete="off" class="layui-input">';
html += '</div>';
html += '<div class="layui-form-mid">替换为</div>';
html += '<div class="layui-input-inline">';
html += '<input type="text" name="' + type + '[replace_keywords][after][]" placeholder="非必填" autocomplete="off" class="layui-input">';
html += '</div>';
html += '<button class="layui-btn layui-btn-warm delSet">';
html += '<i class="layui-icon">&#xe640;</i>';
html += '</button>';
html += '</div>';
console.log(html)
$("." + type + "").append(html);
}
function back()
{
window.history.back();
}
</script>
{/block}

View File

@ -0,0 +1,188 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style>
.goods-info{
display: inline-flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: center;
height: 60px;
width: 100% !important;
}
.goods-info .goods-info-image{
width: 50px;
height: 50px;
margin-right: 10px;
}
.goods-info .goods-info-image .goods-logo{
width: 100% !important;
height: 100% !important;
}
.goods-info .goods-info-desc{
height: 50px;
display: inline-flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: center;
align-items: flex-start;
width: calc(100% - 65px);
}
.goods-info .goods-info-desc .name{
height: 25px;
width: 100%;
line-height: 25px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.goods-info .goods-info-desc .brand{
height: 25px;
line-height: 25px;
}
.button-group{
display: inline-flex;
}
</style>
{/block}
{block name="main"}
<!-- 顶部内容 -->
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<div class="layui-colla-content layui-form layui-show member-form" lay-filter="search_form">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">关键词</label>
<div class="layui-input-inline input-append">
<input type="text" class="layui-input" name="filter[title]" autocomplete="off" placeholder="请输入关键字">
</div>
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="search">查询</button>
</div>
</div>
<div class="form-row">
<a href="/ali1688/shop/template/add.html" class="layui-btn">
添加模板
</a>
</div>
</div>
</div>
</div>
<!-- 列表 -->
<table id="listContent" lay-filter="listContent"></table>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="button-group">
<button class="layui-btn" lay-event="edit">编辑</button>
<button class="layui-btn" lay-event="delete">删除</button>
</div>
</script>
{/block}
{block name="script"}
<script>
var table,form,editIframe,repeat_flag = false;//防重复标识;
layui.use(['form'], function() {
form = layui.form;
form.render();
// 内容获取
table = new Table({
elem: '#listContent',
url: ns.url("ali1688://shop/template/lists"),
cols: [[
{align: 'center', title: '标题', field: 'title', unresize: 'false'},
// {align: 'center', title: '运费模板', field: 'template_id', unresize: 'false'},
{ align: 'center', title: '状态', field: 'is_default', unresize: 'false', templet: function (d) {
if (d.is_default == 1) {
return '默认';
} else {
return '否';
}
}
},
{align: 'center', title: '规则', field: 'price_set', unresize: 'false',
templet:function (d) {
let json=JSON.parse(d.price_set);
if(json.multiple){
return '按进价增'+json.multiple+"%";
}else if(json.increase){
return json.increase+"按进货价增值倍数";
}else{
return "无";
};
}
},
{align: 'center', title: '添加时间', field: 'create_time', unresize: 'false',
templet: function (d) {
return ns.time_to_date(d.create_time);
}
},
{title: '操作', toolbar: '#operation', unresize: 'false', align: 'center', width: 120}
]],
});
// 点击搜索
form.on('submit(search)', function (data) {
if(data.field['filter[title]']){
table.reload({
page: {
curr: 1
},
where: data.field
});
} else {
layer.msg('请输入关键字');
}
});
// 重置表单
form.on('submit(reset)', function (data) {
let field = {
"goods_name": "",
};
form.val("search_form", field);
layui.form.render();
// 刷新表格
table.reload({
page: {
curr: 1
},
where: field
});
});
// 监听工具栏操作
table.tool(function (obj) {
let data = obj.data;
let type = obj.event;
// console.log(data,type)
if (type === 'edit') {
location.href = ns.url("ali1688://shop/template/edit", {id:data.id});
// window.location.href = "/ali1688/shop/template/edit.html?id=" + data.id;
} else if (type === 'delete') {
confirmIndex = layer.confirm('确认删除该模板?', function () {
layer.close(2222);
let loadingIndex = ns.loading('open', '正在进行处理,请耐心等待......');
$.ajax({
url: "/ali1688/shop/template/del.html",
data: {
id: data.id,
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.close(loadingIndex);
if (parseInt(res.code) === 0) {
let alertIndex = layer.alert(res.message, function (index) {
layer.close(alertIndex);
table.reload();
});
} else {
layer.msg(res.message);
}
}
});
}, function () {
layer.close(confirmIndex);
});
}
});
})
</script>
{/block}

View File

@ -0,0 +1,278 @@
{extend name="app/shop/view/base.html"/}
{block name="resources"}
<style type="text/css">
.access {
padding: 10px;
}
.access-title {
font-size: 18px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #333333;
}
.access-item {
background-color: #F8F8F8;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.item {
display: flex;
justify-content: space-between;
margin: 20px 0 20px 10px;
}
.item-datail {
position: relative;
}
.item-number {
width: 30px;
height: 30px;
border-radius: 50%;
border: 5px solid #eee;
position: absolute;
top: -5px;
left: -45px;
box-sizing: border-box;
font-size: 10px;
line-height: 20px;
}
.item-number label {
width: 20px;
height: 20px;
background: #ddd;
border-radius: 50%;
text-align: center;
color: #FFFFFF !important;
display: inline-block;
font-size: 12px;
}
.item-number.active {
border: 5px solid rgba(255, 106, 0, 0.5);
}
.item-number.active label {
background: #FF6A00;
}
.item-check {
position: absolute;
top: 5px;
left: 20px;
width: 25px;
height: 25px;
background: #CCCCCC;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.item-check i {
border-radius: 50%;
border: none;
font-size: 14px;
color: #fff
}
.item-checked {
background: rgba(255, 106, 0, 0.5);
border-radius: 50%;
}
.item-checked i {
color: #ff6a00
}
.item-datail div {
font-size: 14px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #333333;
margin-bottom: 10px;
}
.item-datail p {
display: inline-block;
font-size: 12px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #999999;
}
.item-datail a {
font-size: 12px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #FF6A00 !important;
}
.item button {
width: 88px;
height: 34px;
background: #FF6A00;
border-radius: 2px;
border: 1px solid #FFFFFF;
font-weight: 400;
color: #FFFFFF;
cursor: pointer;
}
.item span, .item a, .item button {
margin-right: 40px;
margin-top: 10px;
}
.layui-timeline-item:before {
top: 27px;
}
.order-pay-layer .wrap {
display: flex;
}
.order-pay-layer .wrap .flex {
flex: 1
}
.order-pay-layer .wrap .flex:last-child {
border-left: 1px solid #eee
}
.order-pay-layer .qrcode img {
width: 150px;
margin: auto;
display: block;
}
.order-pay-layer .goods-name {
margin-right: 15px;
font-weight: bold;
}
.order-pay-layer .price {
margin-right: 15px;
margin-top: 15px;
font-weight: bold;
}
.order-pay-layer .tips {
margin-bottom: 15px;
}
a:hover {
text-decoration: none !important;
cursor: pointer
}
</style>
{/block}
{block name="main"}
<div class="access">
<div class="access-title">1688精选代发</div>
<ul class="layui-timeline">
<li class="layui-timeline-item">
<div class="layui-timeline-content layui-text">
<div class="item">
<div class="item-datail">
<div class="item-number active">
<label>1</label>
</div>
<div>创建1688账号</div>
<p>在1688中创建视频号如已有1688可越过该步骤。</p>
</div>
<a href="https://www.yuque.com/yuqueyonghuwahz8b/ogiw29/ioyzisgv1kccwnkh?singleDoc# 《1688代发指南》" target="_blank" class="layui-btn">接入指南</a>
</div>
</div>
</li>
<li class="layui-timeline-item">
<div class="layui-timeline-content layui-text">
<div class="item">
<div class="item-datail">
<div class="item-number {if $checkres['code'] == 0 && $checkres['data']['status'] == 2}active{/if}">
<label>2</label>
</div>
<div>1688代发精选</div>
<p>去订购'精选代发'开通之后<a href="{$authorization_url}" target="_blank">去订购</a></p>
</div>
</div>
<div class="access-item">
<div class="item">
<div class="item-datail">
<div class="item-check {if $checkres['code'] == 0 && $checkres['data']['status'] == 2 }item-checked{/if}">
<i class="iconfont iconduihao"></i>
</div>
<div style="margin-left: 60px;">
<label>完成支付宝代扣</label>
<br>
<p>请完成1688支付宝自动代扣协议<a
href="{:addon_url('shopcomponent://shop/goods/lists')}">前去添加</a></p>
</div>
</div>
<span>已完成</span>
</div>
</div>
</div>
</li>
<li class="layui-timeline-item">
<div class="layui-timeline-content layui-text">
<div class="item">
<div class="item-datail">
<div class="item-number {if $checkres['code'] == 0 && $checkres['data']['status'] == 2 }active{/if}">
<label>3</label>
</div>
<div>完成了去选品</div>
<p>开通成功之后 选品库中的商品 商家到产品库<a href="{:addon_url('ali1688/shop/goods/lists')}" target="_blank">前去添加</a>
</p>
</div>
</div>
</div>
</li>
<li class="layui-timeline-item">
<div class="layui-timeline-content layui-text">
<div class="item">
<div class="item-datail">
<div class="item-number {if $checkres['code'] == 0 && $checkres['data']['status'] == 2 }active{/if}">
<label>4</label>
</div>
<div>开启自动下单</div>
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">开启自动下单</label>
<div class="layui-input-block">
<input type="checkbox" name="isAutoBuyOrder" lay-skin="switch" value="1"
lay-filter="switchTest" lay-text="ON|OFF" {if $info.isAutoBuyOrder??''} checked {/if} >
</div>
<div class="word-aux">
<p>客户下单后系统将完成自动化下单到1688精选</p>
</div>
</div>
</div>
</div>
</div>
</div>
</li>
</ul>
</div>
<div class="layui-form">
</div>
{/block}
{block name="script"}
<script type="text/javascript">
var laytpl, repeatTag = false;
layui.use(['form', 'laydate'], function () {
laytpl = layui.laytpl;
var form = layui.form, laydate = layui.laydate, repeat_flag = false; //防重复标识
form.render();
});
function apply() {
$.ajax({
url: ns.url("shopcomponent://shop/goods/access"),
dataType: 'JSON',
type: 'POST',
success: function (res) {
if (res.code == 0) {
layer.msg('开通成功');
setTimeout(function () {
location.reload();
}, 1000)
} else {
layer.msg(res.message);
}
}
});
}
</script>
{/block}

View File

@ -0,0 +1,25 @@
<?php
namespace addon\aliapp\api\controller;
use addon\aliapp\model\AliPayApplet;
use app\api\controller\BaseApi;
use think\Exception;
class Aliapp extends BaseApi
{
public function authcodetouserid()
{
try {
$aliPayAppletModel = new AliPayApplet($this->site_id);
$baseInfo = $aliPayAppletModel->loginBaseInfo($this->params['code']);
return $this->response($baseInfo);
} catch (Exception $e) {
return $this->response([]);
}
}
//用户订阅消息
public function messagetmplids()
{
return $this->response($this->success());
}
}

View File

@ -0,0 +1,217 @@
<?php
namespace addon\aliapp\api\controller;
use addon\aliapp\model\MinCode;
use addon\alipay\data\sdk\AopClient;
use addon\coupon\model\Coupon;
use app\api\controller\BaseApi;
use app\model\member\MemberAccount;
use app\model\member\MemberLevel;
use app\model\system\Cron;
use think\facade\Log;
class AliappMemberCard extends BaseApi
{
public $aop;
function __construct()
{
parent::__construct();
$config_info = config('alipay.platform');
// 获取支付宝支付参数(统一支付到平台账户)
$this->aop = new AopClient();
$this->aop->alipayrsaPublicKey = $config_info['public_key'] ?? "";
$this->aop->alipayPublicKey = $config_info['alipay_public_key'] ?? "";
$this->aop->appId = $config_info["appid"] ?? "";
$this->aop->rsaPrivateKey = $config_info['private_key'] ?? "";
$this->aop->alipaySdkVersion = "alipay-sdk-php-20200415";
$this->aop->apiVersion = '1.0';
$this->aop->signType = 'RSA2';
$this->aop->postCharset = 'UTF-8';
$this->aop->format = 'json';
}
public function userOpencardGet()
{
$param = request()->param();
// $param = json_decode('{"sign":"n1x8rBXsU0Hb\/kX5GT\/OMxKh5Sr3Zslz0a8njra+cU6DzEaeniquoNYCKyY3nz3WZ5TfQsuXQq3ukvoh9SOfXyRKmpbb5nnMmhyqI3d7E\/n7o7\/W+cJAeBIgcpUOlj1BZ0sp5e84IWa7XIaYGCTODa8mRGNJAuVM4JIYt4eQP5ExrcFMY4fzE\/SUicDeOAnA29upUKJoaVQNZ1orpLYe1TzeVHEQImoBG0crt8MeCepTFmNlXJMAeD1AjPsbSUpY8rlj4canR+dkzKzh4uKD+kwxSzfLcOM9nf9bZcNiW2bURJ6ZICzEA7Kuskh1OpJ3GwQ8P1ex5vyrtA1+HM7IoA==","method":"spi.alipay.user.opencard.get","charset":"UTF-8","version":"1.0","utc_timestamp":"1694872947","sign_type":"RSA2","out_serial_no":"2088002141785385|20230916|20230916220137444","biz_card_no":"00000000000000000138","template_id":"20230916000000004853317000300387","user_id":"2088002141785385","user_info":"[{\"OPEN_FORM_FIELD_NAME\":\"胡治金\"},{\"OPEN_FORM_FIELD_GENDER\":\"男\"},{\"OPEN_FORM_FIELD_MOBILE\":\"18982255122\"},{\"OPEN_FORM_FIELD_BIRTHDAY\":\"04-02\"}]"}', true);
Log::write('支付宝回调通知-会员卡-userOpencardGet' . json_encode($param, JSON_UNESCAPED_UNICODE));
$rsaCheck = $this->rsaCheck($param);
if (!$rsaCheck) {
$res = [
'response' => [
'code' => '40004',
'msg' => 'Business Failed',
],
];
return json_encode($res, JSON_UNESCAPED_UNICODE);
}
$time = time();
$timestr = date("Y-m-d H:i:s", $time);
$template = model('member_level')->getInfo([['template_id', '=', $param['template_id']]]);
$member = model('member')->getInfo([
['site_id', '=', $template['site_id']],
['ali_openid', '=', $param['user_id']]
]);
$realname = '';
$sex = 0;
$mobile = '';
$birthday = '';
$user_info = json_decode($param['user_info'], TRUE);
foreach ($user_info as $itemArray) {
foreach ($itemArray as $key => $item) {
switch ($key) {
case 'OPEN_FORM_FIELD_NAME':
$realname = $item;
break;
case 'OPEN_FORM_FIELD_GENDER':
switch ($item) {
case '男':
$sex = 1;
break;
case '女':
$sex = 2;
break;
}
break;
case 'OPEN_FORM_FIELD_MOBILE':
$mobile = $item;
break;
case 'OPEN_FORM_FIELD_BIRTHDAY':
$birthday = strtotime('1970-' . $item);
break;
}
}
}
$res = [
'response' => [
'code' => '10000',
'msg' => 'Success',
'card_info' => [
'biz_card_no' => $param['biz_card_no'],
'external_card_no' => 10000 + $member['member_id'],
'open_date' => $timestr,
'valid_date' => date("Y-m-d H:i:s", $time + 10 * 365 * 24 * 60 * 60),
'template_id' => $param['template_id'],
'level' => 'VIP1',
'point' => $member['point'] + $template['send_point'],
'balance' => $member['balance'] + $template['send_balance'],
],
],
];
$upMemberData = [
'is_member' => 1,
'realname' => $realname,
'sex' => $sex,
'mobile' => $mobile,
'birthday' => $birthday,
'ali_card_no' => $param['biz_card_no'],
];
$this->CreateMemberLevel($member, $template, $upMemberData);
return json_encode($res, JSON_UNESCAPED_UNICODE);
}
public function CreateMemberLevel($member_info, $level_info, $upMemberData)
{
$member_account = new MemberAccount();
model('member_level_order')->startTrans();
try {
$level_info['period_unit'] = 'year';
// 如果是首次开卡发放开卡礼包
$count = model('member_level_records')->getCount([['after_level_id', '=', $level_info['level_id']], ['member_id', '=', $member_info['member_id']]]);
if ($count == 0) {
//赠送红包
if ($level_info['send_balance'] > 0) {
$member_account->addMemberAccount($member_info['site_id'], $member_info['member_id'], 'balance', $level_info['send_balance'], 'memberlevel', '会员开卡得红包' . $level_info['send_balance'], '会员开卡奖励发放');
}
//赠送积分
if ($level_info['send_point'] > 0) {
$member_account->addMemberAccount($member_info['site_id'], $member_info['member_id'], 'point', $level_info['send_point'], 'memberlevel', '会员开卡得积分' . $level_info['send_point'], '会员开卡奖励发放');
}
//给用户发放优惠券
if (!empty($level_info['send_coupon'])) {
$coupon_array = explode(',', $level_info['send_coupon']);
$coupon_model = new Coupon();
$coupon_array = array_map(function ($value) {
return ['coupon_type_id' => $value, 'num' => 1];
}, $coupon_array);
$coupon_model->giveCoupon($coupon_array, $member_info['site_id'], $member_info['member_id'], 5);
}
}
if ($member_info['member_level'] != $level_info['level_id']) {
if ($level_info['period_unit'] == 'quarter') {
$expire_time = strtotime("+3 month");
} else {
$expire_time = strtotime("+{1 {$level_info['period_unit']}");
}
// 添加会员卡变更记录
$member_level_model = new MemberLevel();
$member_level_model->addMemberLevelChangeRecord($member_info['member_id'], $member_info['site_id'], $level_info['level_id'], $expire_time, 'buy', $member_info['member_id'], 'member', $member_info['nickname']);
} else {
$old_expire_time = date('Y-m-d', $member_info['level_expire_time']);
if ($level_info['period_unit'] == 'quarter') {
$expire_time = strtotime("{$old_expire_time} +3 month");
} else {
$expire_time = strtotime("{$old_expire_time} +1} {$level_info['period_unit']}");
}
$upMemberData['level_expire_time'] = $expire_time;
// 更新会员卡过期时间
model('member')->update($upMemberData, [['member_id', '=', $member_info['member_id']]]);
$cron = new Cron();
$cron->deleteCron([['event', '=', 'MemberLevelAutoExpire'], ['relate_id', '=', $member_info['member_id']]]);
$cron->addCron(1, 0, "会员卡自动过期", "MemberLevelAutoExpire", $expire_time, $member_info['member_id']);
}
model('member_level_order')->commit();
return $this->success();
} catch (\Exception $e) {
model('member_level_order')->rollback();
return $this->error('', $e->getMessage());
}
}
public function testuserOpencardGet()
{
$param = request()->param();
Log::write('支付宝回调通知-会员卡-userOpencardGet' . json_encode($param, JSON_UNESCAPED_UNICODE));
$rsaCheck = $this->rsaCheck($param);
if (!$rsaCheck) {
$res = [
'response' => [
'code' => '40004',
'msg' => 'Business Failed',
],
];
// $res["sign"] = $this->aop->generateSign($res, "RSA2");
return json_encode($res, JSON_UNESCAPED_UNICODE);
}
$time = time();
$timestr = date("Y-m-d H:i:s", $time);
$res = [
'response' => [
'code' => '10000',
'msg' => 'Success',
'card_info' => [
'biz_card_no' => $param['biz_card_no'],
'external_card_no' => '000001',
'open_date' => $timestr,
'valid_date' => date("Y-m-d H:i:s", $time + 10 * 365 * 24 * 60 * 60),
'template_id' => $param['template_id'],
'balance' => '124.89'
],
],
];
// $res["sign"] = $this->aop->generateSign($res, "RSA2");
return json_encode($res, JSON_UNESCAPED_UNICODE);
}
public function rsaCheck($param)
{
$payModel = new MinCode();
$res = $payModel->verifySgin($param);
return $res;
}
}

View File

@ -0,0 +1,162 @@
<?php
namespace addon\aliapp\api\controller;
use addon\alipay\data\sdk\AopClient;
use app\api\controller\BaseApi;
use app\model\order\OrderCommon as OrderCommonModel;
class Order extends BaseApi
{
public $aop;
public $orderStatus=[
0=>'CREATE',//创建
1=>'WAIT_PAY',//代支付
2=>'CLOSED',//关闭
3=>'REFUNDING',//退款中
4=>'REFUNDED',//已退款
5=>'FINISHED',//已完成
6=>'IN_DELIVERY',//已发货配送中
7=>'REFUND_PART',//部分退款
8=>'RETURN_PART',//部分退货
9=>'TO_SEND_GOODS',//待发货
10=>'PARTIAL_DELIVERY',//部分发货
11=>'SIGNED',//已签收
12=>'PAID',//支付完成
15=>'TO_BE_DELIVERED',//待配送
13=>'CENTRE_DELIVERY',//社区团购中心仓配货
14=>'GRID_DELIVERY',//网格仓配送
];
function __construct()
{
parent::__construct();
$config_info = config('alipay.platform');
// 获取支付宝支付参数(统一支付到平台账户)
$this->aop = new AopClient();
$this->aop->alipayrsaPublicKey = $config_info['public_key'] ?? "";
$this->aop->alipayPublicKey = $config_info['alipay_public_key'] ?? "";
$this->aop->appId = $config_info["appid"] ?? "";
$this->aop->rsaPrivateKey = $config_info['private_key'] ?? "";
$this->aop->alipaySdkVersion = "alipay-sdk-php-20200415";
$this->aop->apiVersion = '1.0';
$this->aop->signType = 'RSA2';
$this->aop->postCharset = 'UTF-8';
$this->aop->format = 'json';
}
/***
* 单个订单查询
* spi.alipay.merchant.order.realtimeinfo.query
* @return void
*/
public function query()
{
file_put_contents('query.txt', json_encode(input('')));
$merchant_order_no=input('merchant_order_no','');
$result=[];
if($merchant_order_no){
$order_common_model = new OrderCommonModel();
$condition=[
['out_trade_no','=',$merchant_order_no]
];
$orderInfo=$order_common_model->getOrderInfo($condition);
$result=[
'merchant_order_status'=>'',
];
}
$data = [
'code' => 10000,
'msg' => 'Success',
'success' => true,
'result' => [],
'error_code' => '',
'error_desc' => '',
];
if(empty($result)){
$data['code']='40004';
$data['success']=false;
$data['error_code']='BIZ_ERROR';
$data['error_desc']='未找到当前订单';
}
$response = [
'response' =>$data ,
'sign' => $this->sign($data),
];
// return json($response);
}
/***
* 批量订单查询
* @return void
*/
public function batchquery()
{
file_put_contents('batchquery.txt', json_encode(input('')));
$data = [
'code' => 10000,
'msg' => 'Success',
'success' => true,
'error_code' => '',
'error_desc' => '',
'journey_order_list' => [],
];
if(empty($result)){
$data['code']='40004';
$data['success']=false;
$data['error_code']='BIZ_ERROR';
$data['error_desc']='未找到当前订单';
}
$response = [
'response' =>$data ,
'sign' => $this->sign($data),
];
// return json($response);
}
/**
* 支付宝
* 本地生活
* 查询订单是否可退款
* @return void
*/
public function refundconfirm()
{
file_put_contents('refundconfirm.txt', json_encode(input('')));
}
/***
* 本地生活
* 三方凭证发放
* 商家发送核销凭证
* @return void
*/
public function send()
{
file_put_contents('Minsend.txt', json_encode(input('')));
}
/**
* 小程序商品动态数据查询
* @return void
*/
public function MinBatchquery()
{
file_put_contents('MinBatchquery.txt', json_encode(input('')));
}
/***
* 签名
* @param $response
* @return string|null
*/
private function sign($response = [])
{
ksort($response);
$sign=$this->aop->sign(json_encode($response), "RSA2");
return $sign;
}
}

View File

@ -0,0 +1,12 @@
<?php
return [
'diy' => [
'view' => [
],
'util' => [
],
'link' => [
],
],
];

View File

@ -0,0 +1,74 @@
<?php
// 事件定义文件
return [
'bind' => [],
'listen' => [
// 生成获取二维码
'Qrcode' => [
'addon\aliapp\event\Qrcode'
],
'ShowPromotion' => [
'addon\aliapp\event\ShowPromotion',
],
'DecryptData' => [
'addon\aliapp\event\DecryptData',
],
'SendMessageTemplate'=>[ //发送模版消息
'addon\aliapp\event\SendMessageTemplate'
],
// 支付宝网关通知
'AliAuthNotify' => [
'addon\aliapp\event\AliAuthNotify', // 服务订购通知
'addon\aliapp\event\AliAuditResult', // 小程序事件
'addon\aliapp\event\AlipayMerchant', // 直付通进件通知
],
'AliPayMerchantPassed' => [ //支付宝二级商户进件成功
'addon\aliapp\event\AliPayMerchantPassed'
],
'AliappRegAuth' => [ //小程序注册授权通知
'addon\aliapp\event\AliappMiniReg'
],
// 权益即将过期通知
'NoticeImpendingExpiration' => [
'addon\aliapp\event\NoticeImpendingExpiration'
],
// 权益即将过期列表获取
'ImpendingExpirationListGet' => [
'addon\aliapp\event\ImpendingExpirationListGet'
],
'addMemberTemplate' => [
'addon\aliapp\event\addMemberTemplate'
],
'editMemberTemplate' => [
'addon\aliapp\event\editMemberTemplate'
],
'AlipayAuditPassed'=>[ //版本通过
'addon\aliapp\event\AlipayAuditPassed'
],
'AlipayServicemarketAddSite'=>[//服务注册账号短信
'addon\aliapp\event\AlipayServicemarketAddSite'
],
'PhoneNumber'=>[
'addon\aliapp\event\PhoneNumber'
],
'AliZmCloudPayNotify'=>[ //芝麻行业云
'addon\aliapp\event\PayNotify'
],
'AliPut' => [ //上传文件
'addon\aliapp\event\Put'
],
'checkAccess'=>[//检查接入状态
// 'addon\aliapp\event\checkAccess'
],
'PaySecurityCheck'=>[
'addon\aliapp\event\PaySecurityCheck'
],
'VerifyCard'=>[
'addon\aliapp\event\VerifyCard'
],
'SubscribeMessages'=>[
'addon\aliapp\event\SubscribeMessages'
]
],
'subscribe' => [],
];

View File

@ -0,0 +1,10 @@
<?php
return [
'name' => 'aliapp',
'title' => '支付宝小程序',
'description' => '支付宝小程序,支付,电商社交',
'status' => 1,
'author' => '',
'version' => '1.0',
'content' => '',
];

View File

@ -0,0 +1,5 @@
<?php
// +----------------------------------------------------------------------
// | 平台端菜单设置
// +----------------------------------------------------------------------
return [];

View File

@ -0,0 +1,89 @@
<?php
// +----------------------------------------------------------------------
// | 平台端菜单设置
// +----------------------------------------------------------------------
return [
[
'name' => 'SHOP_ALIAPP_ROOT',
'title' => '支付宝小程序',
'url' => 'aliapp://shop/aliapp/setting',
'parent' => 'CHANNEL_ROOT',
'picture' => 'addon/aliapp/shop/view/public/img/alipay_app_new.png',
'picture_selected' => 'addon/aliapp/shop/view/public/img/alipay_app_select.png',
'is_show' => 0,
'sort' => 2,
'child_list' => [
[
'name' => 'ALIPAY_CONFIG',
'title' => '基础配置',
'url' => 'aliapp://shop/alipay/config',
'is_show' => 0,
'sort' => 2,
],
[
'name' => 'ALIPAY_PACKAGE',
'title' => '小程序发布',
'url' => 'aliapp://shop/alipay/package',
'is_show' => 0,
'sort' => 3,
],
[
'name' => 'ALIPAY_SHARE',
'title' => '小程序分享',
'url' => 'aliapp://shop/alipay/share',
'is_show' => 0,
'sort' => 6
],
[
'name' => 'ALIPAY_BASEINFO',
'title' => '基础信息设置',
'url' => 'aliapp://aliapp/shop/aliapp/editapp',
'is_show' => 0,
'sort' => 6
],
[
'name' => 'ALIPAY_RELEASE_APPLET',
'title' => '发布小程序',
'url' => 'aliapp://shop/AppletRelease/index',
'is_show' => 1,
'sort' => 2
],
[
'name' => 'ALIPAY_MEMBER_APPLET',
'title' => '应用成员',
'url' => 'aliapp://shop/member/index',
'is_show' => 1,
'sort' => 4
],
[
'name' => 'ALIAPP_PACKAGE_EDIT',
'parent' => 'MESSAGE_LISTS',
'title' => '编辑订阅消息',
'url' => 'aliapp://shop/message/edit',
'is_show' => 0,
'sort' => 1,
],
]
],
[
'title' => '支付宝维权订单',
'name' => 'ALIPAY_ORDER_ROOT',
'parent' => 'ORDER_MANAGE',
'url' => 'aliapp://shop/order/batchquery',
'is_show' => 0,
'is_control' => 1,
'is_icon' => 0,
'picture' => 'icondingdan',
'picture_selected' => '',
'sort' => 21,
'child_list'=>[
[
'name' => 'ALIAPP_PACKAGE_TRADECOMPLAIN',
'title' => '维权详情',
'url' => 'aliapp://shop/order/complaindetail',
'is_show' => 0,
'sort' => 1,
]
]
]
];

Some files were not shown because too many files have changed in this diff Show More