diff --git a/dal/src/main/java/com/yohoufo/dal/order/EntrySellerRechargeOrderMapper.java b/dal/src/main/java/com/yohoufo/dal/order/EntrySellerRechargeOrderMapper.java
new file mode 100644
index 0000000..7204f64
--- /dev/null
+++ b/dal/src/main/java/com/yohoufo/dal/order/EntrySellerRechargeOrderMapper.java
@@ -0,0 +1,17 @@
+package com.yohoufo.dal.order;
+
+import com.yohoufo.dal.order.model.EntrySellerRechargeOrder;
+
+public interface EntrySellerRechargeOrderMapper {
+    int deleteByPrimaryKey(Integer id);
+
+    int insert(EntrySellerRechargeOrder record);
+
+    int insertSelective(EntrySellerRechargeOrder record);
+
+    EntrySellerRechargeOrder selectByPrimaryKey(Integer id);
+
+    int updateByPrimaryKeySelective(EntrySellerRechargeOrder record);
+
+    int updateByPrimaryKey(EntrySellerRechargeOrder record);
+}
\ No newline at end of file
diff --git a/dal/src/main/java/com/yohoufo/dal/order/MachineIdGenerateMapper.java b/dal/src/main/java/com/yohoufo/dal/order/MachineIdGenerateMapper.java
new file mode 100644
index 0000000..299c4c9
--- /dev/null
+++ b/dal/src/main/java/com/yohoufo/dal/order/MachineIdGenerateMapper.java
@@ -0,0 +1,24 @@
+package com.yohoufo.dal.order;
+
+
+import com.yohoufo.dal.order.model.MachineIdGenerate;
+
+import java.util.List;
+
+public interface MachineIdGenerateMapper {
+    int deleteByPrimaryKey(Integer id);
+
+    int insert(MachineIdGenerate record);
+
+    int insertSelective(MachineIdGenerate record);
+
+    MachineIdGenerate selectByPrimaryKey(Integer id);
+
+    MachineIdGenerate selectByIp(String ip);
+
+    List<MachineIdGenerate> selectByAll();
+
+    int updateByPrimaryKeySelective(MachineIdGenerate record);
+
+    int updateByPrimaryKey(MachineIdGenerate record);
+}
\ No newline at end of file
diff --git a/dal/src/main/java/com/yohoufo/dal/order/SellerWalletDetailMapper.java b/dal/src/main/java/com/yohoufo/dal/order/SellerWalletDetailMapper.java
new file mode 100644
index 0000000..4717a2f
--- /dev/null
+++ b/dal/src/main/java/com/yohoufo/dal/order/SellerWalletDetailMapper.java
@@ -0,0 +1,17 @@
+package com.yohoufo.dal.order;
+
+import com.yohoufo.dal.order.model.SellerWalletDetail;
+
+public interface SellerWalletDetailMapper {
+    int deleteByPrimaryKey(Integer id);
+
+    int insert(SellerWalletDetail record);
+
+    int insertSelective(SellerWalletDetail record);
+
+    SellerWalletDetail selectByPrimaryKey(Integer id);
+
+    int updateByPrimaryKeySelective(SellerWalletDetail record);
+
+    int updateByPrimaryKey(SellerWalletDetail record);
+}
\ No newline at end of file
diff --git a/dal/src/main/java/com/yohoufo/dal/order/SellerWalletMapper.java b/dal/src/main/java/com/yohoufo/dal/order/SellerWalletMapper.java
new file mode 100644
index 0000000..2a190f2
--- /dev/null
+++ b/dal/src/main/java/com/yohoufo/dal/order/SellerWalletMapper.java
@@ -0,0 +1,18 @@
+package com.yohoufo.dal.order;
+
+import com.yohoufo.dal.order.model.SellerWallet;
+
+public interface SellerWalletMapper {
+
+    int insert(SellerWallet record);
+
+    int insertSelective(SellerWallet record);
+
+    SellerWallet selectByPrimaryKey(Integer id);
+
+    int updateByPrimaryKeySelective(SellerWallet record);
+
+    int updateByPrimaryKey(SellerWallet record);
+
+    SellerWallet selectByUidNType(SellerWallet condition);
+}
\ No newline at end of file
diff --git a/dal/src/main/java/com/yohoufo/dal/order/SkupBatchMapper.java b/dal/src/main/java/com/yohoufo/dal/order/SkupBatchMapper.java
new file mode 100644
index 0000000..77375dc
--- /dev/null
+++ b/dal/src/main/java/com/yohoufo/dal/order/SkupBatchMapper.java
@@ -0,0 +1,17 @@
+package com.yohoufo.dal.order;
+
+import com.yohoufo.dal.order.model.SkupBatch;
+
+public interface SkupBatchMapper {
+    int deleteByPrimaryKey(Long id);
+
+    int insert(SkupBatch record);
+
+    int insertSelective(SkupBatch record);
+
+    SkupBatch selectByPrimaryKey(Long id);
+
+    int updateByPrimaryKeySelective(SkupBatch record);
+
+    int updateByPrimaryKey(SkupBatch record);
+}
\ No newline at end of file
diff --git a/dal/src/main/java/com/yohoufo/dal/order/model/EntrySellerRechargeOrder.java b/dal/src/main/java/com/yohoufo/dal/order/model/EntrySellerRechargeOrder.java
new file mode 100644
index 0000000..18541d9
--- /dev/null
+++ b/dal/src/main/java/com/yohoufo/dal/order/model/EntrySellerRechargeOrder.java
@@ -0,0 +1,95 @@
+package com.yohoufo.dal.order.model;
+
+import java.math.BigDecimal;
+
+public class EntrySellerRechargeOrder {
+    private Integer id;
+
+    private Integer uid;
+
+    private Long orderCode;
+
+    private Integer payment;
+
+    private Integer status;
+
+    private BigDecimal amount;
+
+    private Integer type;
+
+    private Integer createTime;
+
+    private Integer updateTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUid() {
+        return uid;
+    }
+
+    public void setUid(Integer uid) {
+        this.uid = uid;
+    }
+
+    public Long getOrderCode() {
+        return orderCode;
+    }
+
+    public void setOrderCode(Long orderCode) {
+        this.orderCode = orderCode;
+    }
+
+    public Integer getPayment() {
+        return payment;
+    }
+
+    public void setPayment(Integer payment) {
+        this.payment = payment;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Integer createTime) {
+        this.createTime = createTime;
+    }
+
+    public Integer getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Integer updateTime) {
+        this.updateTime = updateTime;
+    }
+}
\ No newline at end of file
diff --git a/dal/src/main/java/com/yohoufo/dal/order/model/MachineIdGenerate.java b/dal/src/main/java/com/yohoufo/dal/order/model/MachineIdGenerate.java
new file mode 100644
index 0000000..0bfce0c
--- /dev/null
+++ b/dal/src/main/java/com/yohoufo/dal/order/model/MachineIdGenerate.java
@@ -0,0 +1,43 @@
+package com.yohoufo.dal.order.model;
+
+public class MachineIdGenerate {
+    private Integer id;
+
+    private String ip;
+
+    private Integer machineId;
+
+    private Integer createTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip == null ? null : ip.trim();
+    }
+
+    public Integer getMachineId() {
+        return machineId;
+    }
+
+    public void setMachineId(Integer machineId) {
+        this.machineId = machineId;
+    }
+
+    public Integer getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Integer createTime) {
+        this.createTime = createTime;
+    }
+}
\ No newline at end of file
diff --git a/dal/src/main/java/com/yohoufo/dal/order/model/SellerWallet.java b/dal/src/main/java/com/yohoufo/dal/order/model/SellerWallet.java
new file mode 100644
index 0000000..c97a8ce
--- /dev/null
+++ b/dal/src/main/java/com/yohoufo/dal/order/model/SellerWallet.java
@@ -0,0 +1,75 @@
+package com.yohoufo.dal.order.model;
+
+import java.math.BigDecimal;
+
+public class SellerWallet {
+    private Integer id;
+
+    private Integer uid;
+
+    private BigDecimal amount;
+
+    private Byte status;
+
+    private Byte type;
+
+    private Integer createTime;
+
+    private Integer updateTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUid() {
+        return uid;
+    }
+
+    public void setUid(Integer uid) {
+        this.uid = uid;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public Byte getStatus() {
+        return status;
+    }
+
+    public void setStatus(Byte status) {
+        this.status = status;
+    }
+
+    public Byte getType() {
+        return type;
+    }
+
+    public void setType(Byte type) {
+        this.type = type;
+    }
+
+    public Integer getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Integer createTime) {
+        this.createTime = createTime;
+    }
+
+    public Integer getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Integer updateTime) {
+        this.updateTime = updateTime;
+    }
+}
\ No newline at end of file
diff --git a/dal/src/main/java/com/yohoufo/dal/order/model/SellerWalletDetail.java b/dal/src/main/java/com/yohoufo/dal/order/model/SellerWalletDetail.java
new file mode 100644
index 0000000..45ba7b4
--- /dev/null
+++ b/dal/src/main/java/com/yohoufo/dal/order/model/SellerWalletDetail.java
@@ -0,0 +1,85 @@
+package com.yohoufo.dal.order.model;
+
+import java.math.BigDecimal;
+
+public class SellerWalletDetail {
+    private Integer id;
+
+    private Integer walletId;
+
+    private Integer uid;
+
+    private Long orderCode;
+
+    private BigDecimal amount;
+
+    private Byte type;
+
+    private Integer createTime;
+
+    private Integer updateTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getWalletId() {
+        return walletId;
+    }
+
+    public void setWalletId(Integer walletId) {
+        this.walletId = walletId;
+    }
+
+    public Integer getUid() {
+        return uid;
+    }
+
+    public void setUid(Integer uid) {
+        this.uid = uid;
+    }
+
+    public Long getOrderCode() {
+        return orderCode;
+    }
+
+    public void setOrderCode(Long orderCode) {
+        this.orderCode = orderCode;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public Byte getType() {
+        return type;
+    }
+
+    public void setType(Byte type) {
+        this.type = type;
+    }
+
+    public Integer getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Integer createTime) {
+        this.createTime = createTime;
+    }
+
+    public Integer getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Integer updateTime) {
+        this.updateTime = updateTime;
+    }
+}
\ No newline at end of file
diff --git a/dal/src/main/java/com/yohoufo/dal/order/model/SkupBatch.java b/dal/src/main/java/com/yohoufo/dal/order/model/SkupBatch.java
new file mode 100644
index 0000000..2764d24
--- /dev/null
+++ b/dal/src/main/java/com/yohoufo/dal/order/model/SkupBatch.java
@@ -0,0 +1,43 @@
+package com.yohoufo.dal.order.model;
+
+public class SkupBatch {
+    private Long id;
+
+    private Integer uid;
+
+    private Integer num;
+
+    private Integer createTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Integer getUid() {
+        return uid;
+    }
+
+    public void setUid(Integer uid) {
+        this.uid = uid;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public Integer getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Integer createTime) {
+        this.createTime = createTime;
+    }
+}
\ No newline at end of file
diff --git a/dal/src/main/java/com/yohoufo/dal/product/StorageMapper.java b/dal/src/main/java/com/yohoufo/dal/product/StorageMapper.java
index 932b8d1..9d31825 100644
--- a/dal/src/main/java/com/yohoufo/dal/product/StorageMapper.java
+++ b/dal/src/main/java/com/yohoufo/dal/product/StorageMapper.java
@@ -24,4 +24,6 @@ public interface StorageMapper {
 	int addStorageNum(@Param("storageId")Integer storageId, @Param("storageNum")Integer storageNum);
 	
     List<Storage> selectByGoodsId(Integer goodsId);
+    
+    int batchAddStorageNum(@Param("storageList")List<Storage> storageList);
 }
\ No newline at end of file
diff --git a/dal/src/main/java/com/yohoufo/dal/product/StoragePriceMapper.java b/dal/src/main/java/com/yohoufo/dal/product/StoragePriceMapper.java
index 02b6694..5ad34a4 100644
--- a/dal/src/main/java/com/yohoufo/dal/product/StoragePriceMapper.java
+++ b/dal/src/main/java/com/yohoufo/dal/product/StoragePriceMapper.java
@@ -10,6 +10,8 @@ public interface StoragePriceMapper {
     int deleteByPrimaryKey(Integer id);
 
     int insert(StoragePrice record);
+    
+    int insertBatch(@Param("storagePriceList")List<StoragePrice> storagePriceList);
 
     StoragePrice selectByPrimaryKey(Integer id);
     
@@ -25,9 +27,13 @@ public interface StoragePriceMapper {
 	
 	int updateStatus(@Param("skup")Integer skup, @Param("status")Integer status, @Param("beforeStatus")Integer beforeStatus);
 	
+	int batchUpdateStatus(@Param("skupList")List<Integer> skupList, @Param("status")Integer status);
+	
 	int updateDepotNum(@Param("skup")Integer skup, @Param("depotNum")Integer depotNum);
 
     StoragePrice selectLeastPrice(Integer storageId);
 
     List<StoragePrice> selectByStorageIds(List<Integer> storageIds);
+    
+    List<StoragePrice> selectBySkupList(@Param("skupList")List<Integer> skupList);
 }
\ No newline at end of file
diff --git a/dal/src/main/resources/META-INF/mybatis/order/EntrySellerRechargeOrderMapper.xml b/dal/src/main/resources/META-INF/mybatis/order/EntrySellerRechargeOrderMapper.xml
new file mode 100644
index 0000000..f686b80
--- /dev/null
+++ b/dal/src/main/resources/META-INF/mybatis/order/EntrySellerRechargeOrderMapper.xml
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.yohoufo.dal.order.EntrySellerRechargeOrderMapper" >
+  <resultMap id="BaseResultMap" type="com.yohoufo.dal.order.model.EntrySellerRechargeOrder" >
+    <id column="id" property="id" jdbcType="INTEGER" />
+    <result column="uid" property="uid" jdbcType="INTEGER" />
+    <result column="order_code" property="orderCode" jdbcType="BIGINT" />
+    <result column="payment" property="payment" jdbcType="TINYINT" />
+    <result column="status" property="status" jdbcType="TINYINT" />
+    <result column="amount" property="amount" jdbcType="DECIMAL" />
+    <result column="type" property="type" jdbcType="TINYINT" />
+    <result column="create_time" property="createTime" jdbcType="INTEGER" />
+    <result column="update_time" property="updateTime" jdbcType="INTEGER" />
+  </resultMap>
+  <sql id="Base_Column_List" >
+    id, uid, order_code, payment, status, amount, type, create_time, update_time
+  </sql>
+  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
+    select 
+    <include refid="Base_Column_List" />
+    from entry_seller_recharge_order
+    where id = #{id,jdbcType=INTEGER}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
+    delete from entry_seller_recharge_order
+    where id = #{id,jdbcType=INTEGER}
+  </delete>
+  <insert id="insert" parameterType="com.yohoufo.dal.order.model.EntrySellerRechargeOrder" >
+    insert into entry_seller_recharge_order (id, uid, order_code, 
+      payment, status, amount, 
+      type, create_time, update_time
+      )
+    values (#{id,jdbcType=INTEGER}, #{uid,jdbcType=INTEGER}, #{orderCode,jdbcType=BIGINT}, 
+      #{payment,jdbcType=TINYINT}, #{status,jdbcType=TINYINT}, #{amount,jdbcType=DECIMAL}, 
+      #{type,jdbcType=TINYINT}, #{createTime,jdbcType=INTEGER}, #{updateTime,jdbcType=INTEGER}
+      )
+  </insert>
+  <insert id="insertSelective" parameterType="com.yohoufo.dal.order.model.EntrySellerRechargeOrder" >
+    insert into entry_seller_recharge_order
+    <trim prefix="(" suffix=")" suffixOverrides="," >
+      <if test="id != null" >
+        id,
+      </if>
+      <if test="uid != null" >
+        uid,
+      </if>
+      <if test="orderCode != null" >
+        order_code,
+      </if>
+      <if test="payment != null" >
+        payment,
+      </if>
+      <if test="status != null" >
+        status,
+      </if>
+      <if test="amount != null" >
+        amount,
+      </if>
+      <if test="type != null" >
+        type,
+      </if>
+      <if test="createTime != null" >
+        create_time,
+      </if>
+      <if test="updateTime != null" >
+        update_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides="," >
+      <if test="id != null" >
+        #{id,jdbcType=INTEGER},
+      </if>
+      <if test="uid != null" >
+        #{uid,jdbcType=INTEGER},
+      </if>
+      <if test="orderCode != null" >
+        #{orderCode,jdbcType=BIGINT},
+      </if>
+      <if test="payment != null" >
+        #{payment,jdbcType=TINYINT},
+      </if>
+      <if test="status != null" >
+        #{status,jdbcType=TINYINT},
+      </if>
+      <if test="amount != null" >
+        #{amount,jdbcType=DECIMAL},
+      </if>
+      <if test="type != null" >
+        #{type,jdbcType=TINYINT},
+      </if>
+      <if test="createTime != null" >
+        #{createTime,jdbcType=INTEGER},
+      </if>
+      <if test="updateTime != null" >
+        #{updateTime,jdbcType=INTEGER},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.yohoufo.dal.order.model.EntrySellerRechargeOrder" >
+    update entry_seller_recharge_order
+    <set >
+      <if test="uid != null" >
+        uid = #{uid,jdbcType=INTEGER},
+      </if>
+      <if test="orderCode != null" >
+        order_code = #{orderCode,jdbcType=BIGINT},
+      </if>
+      <if test="payment != null" >
+        payment = #{payment,jdbcType=TINYINT},
+      </if>
+      <if test="status != null" >
+        status = #{status,jdbcType=TINYINT},
+      </if>
+      <if test="amount != null" >
+        amount = #{amount,jdbcType=DECIMAL},
+      </if>
+      <if test="type != null" >
+        type = #{type,jdbcType=TINYINT},
+      </if>
+      <if test="createTime != null" >
+        create_time = #{createTime,jdbcType=INTEGER},
+      </if>
+      <if test="updateTime != null" >
+        update_time = #{updateTime,jdbcType=INTEGER},
+      </if>
+    </set>
+    where id = #{id,jdbcType=INTEGER}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.yohoufo.dal.order.model.EntrySellerRechargeOrder" >
+    update entry_seller_recharge_order
+    set uid = #{uid,jdbcType=INTEGER},
+      order_code = #{orderCode,jdbcType=BIGINT},
+      payment = #{payment,jdbcType=TINYINT},
+      status = #{status,jdbcType=TINYINT},
+      amount = #{amount,jdbcType=DECIMAL},
+      type = #{type,jdbcType=TINYINT},
+      create_time = #{createTime,jdbcType=INTEGER},
+      update_time = #{updateTime,jdbcType=INTEGER}
+    where id = #{id,jdbcType=INTEGER}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/dal/src/main/resources/META-INF/mybatis/order/MachineIdGenerateMapper.xml b/dal/src/main/resources/META-INF/mybatis/order/MachineIdGenerateMapper.xml
new file mode 100644
index 0000000..684c3a8
--- /dev/null
+++ b/dal/src/main/resources/META-INF/mybatis/order/MachineIdGenerateMapper.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.yohoufo.dal.order.MachineIdGenerateMapper" >
+  <resultMap id="BaseResultMap" type="com.yohoufo.dal.order.model.MachineIdGenerate" >
+    <id column="id" property="id" jdbcType="INTEGER" />
+    <result column="ip" property="ip" jdbcType="VARCHAR" />
+    <result column="machine_id" property="machineId" jdbcType="INTEGER" />
+    <result column="create_time" property="createTime" jdbcType="INTEGER" />
+  </resultMap>
+  <sql id="Base_Column_List" >
+    id, ip, machine_id, create_time
+  </sql>
+  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
+    select 
+    <include refid="Base_Column_List" />
+    from machine_id_generate
+    where id = #{id,jdbcType=INTEGER}
+  </select>
+
+  <select id="selectByIp" resultMap="BaseResultMap" parameterType="java.lang.String" >
+    select
+    <include refid="Base_Column_List" />
+    from machine_id_generate
+    where ip = #{ip,jdbcType=VARCHAR}
+  </select>
+
+  <select id="selectByAll" resultMap="BaseResultMap"  >
+    select
+    <include refid="Base_Column_List" />
+    from machine_id_generate
+  </select>
+
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
+    delete from machine_id_generate
+    where id = #{id,jdbcType=INTEGER}
+  </delete>
+  <insert id="insert" parameterType="com.yohoufo.dal.order.model.MachineIdGenerate" >
+    insert into machine_id_generate (id, ip, machine_id, 
+      create_time)
+    values (#{id,jdbcType=INTEGER}, #{ip,jdbcType=VARCHAR}, #{machineId,jdbcType=INTEGER}, 
+      #{createTime,jdbcType=INTEGER})
+  </insert>
+  <insert id="insertSelective" parameterType="com.yohoufo.dal.order.model.MachineIdGenerate" >
+    insert into machine_id_generate
+    <trim prefix="(" suffix=")" suffixOverrides="," >
+      <if test="id != null" >
+        id,
+      </if>
+      <if test="ip != null" >
+        ip,
+      </if>
+      <if test="machineId != null" >
+        machine_id,
+      </if>
+      <if test="createTime != null" >
+        create_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides="," >
+      <if test="id != null" >
+        #{id,jdbcType=INTEGER},
+      </if>
+      <if test="ip != null" >
+        #{ip,jdbcType=VARCHAR},
+      </if>
+      <if test="machineId != null" >
+        #{machineId,jdbcType=INTEGER},
+      </if>
+      <if test="createTime != null" >
+        #{createTime,jdbcType=INTEGER},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.yohoufo.dal.order.model.MachineIdGenerate" >
+    update machine_id_generate
+    <set >
+      <if test="ip != null" >
+        ip = #{ip,jdbcType=VARCHAR},
+      </if>
+      <if test="machineId != null" >
+        machine_id = #{machineId,jdbcType=INTEGER},
+      </if>
+      <if test="createTime != null" >
+        create_time = #{createTime,jdbcType=INTEGER},
+      </if>
+    </set>
+    where id = #{id,jdbcType=INTEGER}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.yohoufo.dal.order.model.MachineIdGenerate" >
+    update machine_id_generate
+    set ip = #{ip,jdbcType=VARCHAR},
+      machine_id = #{machineId,jdbcType=INTEGER},
+      create_time = #{createTime,jdbcType=INTEGER}
+    where id = #{id,jdbcType=INTEGER}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/dal/src/main/resources/META-INF/mybatis/order/SellerWalletDetailMapper.xml b/dal/src/main/resources/META-INF/mybatis/order/SellerWalletDetailMapper.xml
new file mode 100644
index 0000000..990885f
--- /dev/null
+++ b/dal/src/main/resources/META-INF/mybatis/order/SellerWalletDetailMapper.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.yohoufo.dal.order.SellerWalletDetailMapper" >
+  <resultMap id="BaseResultMap" type="com.yohoufo.dal.order.model.SellerWalletDetail" >
+    <id column="id" property="id" jdbcType="INTEGER" />
+    <result column="wallet_id" property="walletId" jdbcType="INTEGER" />
+    <result column="uid" property="uid" jdbcType="INTEGER" />
+    <result column="order_code" property="orderCode" jdbcType="BIGINT" />
+    <result column="amount" property="amount" jdbcType="DECIMAL" />
+    <result column="type" property="type" jdbcType="TINYINT" />
+    <result column="create_time" property="createTime" jdbcType="INTEGER" />
+    <result column="update_time" property="updateTime" jdbcType="INTEGER" />
+  </resultMap>
+  <sql id="Base_Column_List" >
+    id, wallet_id, uid, order_code, amount, type, create_time, update_time
+  </sql>
+  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
+    select 
+    <include refid="Base_Column_List" />
+    from seller_wallet_detail
+    where id = #{id,jdbcType=INTEGER}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
+    delete from seller_wallet_detail
+    where id = #{id,jdbcType=INTEGER}
+  </delete>
+  <insert id="insert" parameterType="com.yohoufo.dal.order.model.SellerWalletDetail" >
+    insert into seller_wallet_detail (id, wallet_id, uid, 
+      order_code, amount, type, 
+      create_time, update_time)
+    values (#{id,jdbcType=INTEGER}, #{walletId,jdbcType=INTEGER}, #{uid,jdbcType=INTEGER}, 
+      #{orderCode,jdbcType=BIGINT}, #{amount,jdbcType=DECIMAL}, #{type,jdbcType=TINYINT}, 
+      #{createTime,jdbcType=INTEGER}, #{updateTime,jdbcType=INTEGER})
+  </insert>
+  <insert id="insertSelective" parameterType="com.yohoufo.dal.order.model.SellerWalletDetail" >
+    insert into seller_wallet_detail
+    <trim prefix="(" suffix=")" suffixOverrides="," >
+      <if test="id != null" >
+        id,
+      </if>
+      <if test="walletId != null" >
+        wallet_id,
+      </if>
+      <if test="uid != null" >
+        uid,
+      </if>
+      <if test="orderCode != null" >
+        order_code,
+      </if>
+      <if test="amount != null" >
+        amount,
+      </if>
+      <if test="type != null" >
+        type,
+      </if>
+      <if test="createTime != null" >
+        create_time,
+      </if>
+      <if test="updateTime != null" >
+        update_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides="," >
+      <if test="id != null" >
+        #{id,jdbcType=INTEGER},
+      </if>
+      <if test="walletId != null" >
+        #{walletId,jdbcType=INTEGER},
+      </if>
+      <if test="uid != null" >
+        #{uid,jdbcType=INTEGER},
+      </if>
+      <if test="orderCode != null" >
+        #{orderCode,jdbcType=BIGINT},
+      </if>
+      <if test="amount != null" >
+        #{amount,jdbcType=DECIMAL},
+      </if>
+      <if test="type != null" >
+        #{type,jdbcType=TINYINT},
+      </if>
+      <if test="createTime != null" >
+        #{createTime,jdbcType=INTEGER},
+      </if>
+      <if test="updateTime != null" >
+        #{updateTime,jdbcType=INTEGER},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.yohoufo.dal.order.model.SellerWalletDetail" >
+    update seller_wallet_detail
+    <set >
+      <if test="walletId != null" >
+        wallet_id = #{walletId,jdbcType=INTEGER},
+      </if>
+      <if test="uid != null" >
+        uid = #{uid,jdbcType=INTEGER},
+      </if>
+      <if test="orderCode != null" >
+        order_code = #{orderCode,jdbcType=BIGINT},
+      </if>
+      <if test="amount != null" >
+        amount = #{amount,jdbcType=DECIMAL},
+      </if>
+      <if test="type != null" >
+        type = #{type,jdbcType=TINYINT},
+      </if>
+      <if test="createTime != null" >
+        create_time = #{createTime,jdbcType=INTEGER},
+      </if>
+      <if test="updateTime != null" >
+        update_time = #{updateTime,jdbcType=INTEGER},
+      </if>
+    </set>
+    where id = #{id,jdbcType=INTEGER}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.yohoufo.dal.order.model.SellerWalletDetail" >
+    update seller_wallet_detail
+    set wallet_id = #{walletId,jdbcType=INTEGER},
+      uid = #{uid,jdbcType=INTEGER},
+      order_code = #{orderCode,jdbcType=BIGINT},
+      amount = #{amount,jdbcType=DECIMAL},
+      type = #{type,jdbcType=TINYINT},
+      create_time = #{createTime,jdbcType=INTEGER},
+      update_time = #{updateTime,jdbcType=INTEGER}
+    where id = #{id,jdbcType=INTEGER}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/dal/src/main/resources/META-INF/mybatis/order/SellerWalletMapper.xml b/dal/src/main/resources/META-INF/mybatis/order/SellerWalletMapper.xml
new file mode 100644
index 0000000..68f561f
--- /dev/null
+++ b/dal/src/main/resources/META-INF/mybatis/order/SellerWalletMapper.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.yohoufo.dal.order.SellerWalletMapper" >
+  <resultMap id="BaseResultMap" type="com.yohoufo.dal.order.model.SellerWallet" >
+    <id column="id" property="id" jdbcType="INTEGER" />
+    <result column="uid" property="uid" jdbcType="INTEGER" />
+    <result column="amount" property="amount" jdbcType="DECIMAL" />
+    <result column="status" property="status" jdbcType="TINYINT" />
+    <result column="type" property="type" jdbcType="TINYINT" />
+    <result column="create_time" property="createTime" jdbcType="INTEGER" />
+    <result column="update_time" property="updateTime" jdbcType="INTEGER" />
+  </resultMap>
+  <sql id="Base_Column_List" >
+    id, uid, amount, status, type, create_time, update_time
+  </sql>
+  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
+    select 
+    <include refid="Base_Column_List" />
+    from seller_wallet
+    where id = #{id,jdbcType=INTEGER}
+  </select>
+
+  <select id="selectByUidNType" resultMap="BaseResultMap" parameterType="com.yohoufo.dal.order.model.SellerWallet" >
+    select
+    <include refid="Base_Column_List" />
+    from seller_wallet
+    where uid = #{uid,jdbcType=INTEGER} and `type` = #{type,jdbcType=TINYINT} limit 1
+  </select>
+
+  <insert id="insert" parameterType="com.yohoufo.dal.order.model.SellerWallet" >
+    insert into seller_wallet (id, uid, amount, 
+      status, type, create_time, 
+      update_time)
+    values (#{id,jdbcType=INTEGER}, #{uid,jdbcType=INTEGER}, #{amount,jdbcType=DECIMAL}, 
+      #{status,jdbcType=TINYINT}, #{type,jdbcType=TINYINT}, #{createTime,jdbcType=INTEGER}, 
+      #{updateTime,jdbcType=INTEGER})
+  </insert>
+  <insert id="insertSelective" parameterType="com.yohoufo.dal.order.model.SellerWallet" >
+    insert into seller_wallet
+    <trim prefix="(" suffix=")" suffixOverrides="," >
+      <if test="id != null" >
+        id,
+      </if>
+      <if test="uid != null" >
+        uid,
+      </if>
+      <if test="amount != null" >
+        amount,
+      </if>
+      <if test="status != null" >
+        status,
+      </if>
+      <if test="type != null" >
+        type,
+      </if>
+      <if test="createTime != null" >
+        create_time,
+      </if>
+      <if test="updateTime != null" >
+        update_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides="," >
+      <if test="id != null" >
+        #{id,jdbcType=INTEGER},
+      </if>
+      <if test="uid != null" >
+        #{uid,jdbcType=INTEGER},
+      </if>
+      <if test="amount != null" >
+        #{amount,jdbcType=DECIMAL},
+      </if>
+      <if test="status != null" >
+        #{status,jdbcType=TINYINT},
+      </if>
+      <if test="type != null" >
+        #{type,jdbcType=TINYINT},
+      </if>
+      <if test="createTime != null" >
+        #{createTime,jdbcType=INTEGER},
+      </if>
+      <if test="updateTime != null" >
+        #{updateTime,jdbcType=INTEGER},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.yohoufo.dal.order.model.SellerWallet" >
+    update seller_wallet
+    <set >
+      <if test="uid != null" >
+        uid = #{uid,jdbcType=INTEGER},
+      </if>
+      <if test="amount != null" >
+        amount = #{amount,jdbcType=DECIMAL},
+      </if>
+      <if test="status != null" >
+        status = #{status,jdbcType=TINYINT},
+      </if>
+      <if test="type != null" >
+        type = #{type,jdbcType=TINYINT},
+      </if>
+      <if test="createTime != null" >
+        create_time = #{createTime,jdbcType=INTEGER},
+      </if>
+      <if test="updateTime != null" >
+        update_time = #{updateTime,jdbcType=INTEGER},
+      </if>
+    </set>
+    where id = #{id,jdbcType=INTEGER}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.yohoufo.dal.order.model.SellerWallet" >
+    update seller_wallet
+    set uid = #{uid,jdbcType=INTEGER},
+      amount = #{amount,jdbcType=DECIMAL},
+      status = #{status,jdbcType=TINYINT},
+      type = #{type,jdbcType=TINYINT},
+      create_time = #{createTime,jdbcType=INTEGER},
+      update_time = #{updateTime,jdbcType=INTEGER}
+    where id = #{id,jdbcType=INTEGER}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/dal/src/main/resources/META-INF/mybatis/order/SkupBatchMapper.xml b/dal/src/main/resources/META-INF/mybatis/order/SkupBatchMapper.xml
new file mode 100644
index 0000000..734ea70
--- /dev/null
+++ b/dal/src/main/resources/META-INF/mybatis/order/SkupBatchMapper.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yohoufo.dal.order.SkupBatchMapper">
+  <resultMap id="BaseResultMap" type="com.yohoufo.dal.order.model.SkupBatch">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="uid" jdbcType="INTEGER" property="uid" />
+    <result column="num" jdbcType="INTEGER" property="num" />
+    <result column="create_time" jdbcType="INTEGER" property="createTime" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    id, uid, num, create_time
+  </sql>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from skup_batch
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from skup_batch
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.yohoufo.dal.order.model.SkupBatch" useGeneratedKeys="true">
+    insert into skup_batch (uid, num, create_time
+      )
+    values (#{uid,jdbcType=INTEGER}, #{num,jdbcType=INTEGER}, #{createTime,jdbcType=INTEGER}
+      )
+  </insert>
+  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.yohoufo.dal.order.model.SkupBatch" useGeneratedKeys="true">
+    insert into skup_batch
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="uid != null">
+        uid,
+      </if>
+      <if test="num != null">
+        num,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="uid != null">
+        #{uid,jdbcType=INTEGER},
+      </if>
+      <if test="num != null">
+        #{num,jdbcType=INTEGER},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=INTEGER},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.yohoufo.dal.order.model.SkupBatch">
+    update skup_batch
+    <set>
+      <if test="uid != null">
+        uid = #{uid,jdbcType=INTEGER},
+      </if>
+      <if test="num != null">
+        num = #{num,jdbcType=INTEGER},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=INTEGER},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.yohoufo.dal.order.model.SkupBatch">
+    update skup_batch
+    set uid = #{uid,jdbcType=INTEGER},
+      num = #{num,jdbcType=INTEGER},
+      create_time = #{createTime,jdbcType=INTEGER}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/dal/src/main/resources/META-INF/mybatis/order/TradeBillsMapper.xml b/dal/src/main/resources/META-INF/mybatis/order/TradeBillsMapper.xml
index bea2ce1..e1765e5 100644
--- a/dal/src/main/resources/META-INF/mybatis/order/TradeBillsMapper.xml
+++ b/dal/src/main/resources/META-INF/mybatis/order/TradeBillsMapper.xml
@@ -49,9 +49,12 @@
     #{tradeStatus},#{createTime},#{dealUid},#{dealStatus},#{dealTime},#{dealRelateId},#{dealUserName})
   </insert>
 
-  <!-- 买家只显示补偿款收入  ,卖家只显示货款收入 -->
+  <!-- 买家只显示补偿款收入  ,卖家只显示货款收入
+    modify by craig.qin 20181109 : 卖家除了显示货款收入,还要显示卖家的补偿款收入
+   -->
   <sql id="Query_Condition_Sql" >
-     uid = #{uid,jdbcType=INTEGER} and income_outcome = 1 and ( (user_type =1 and trade_type = 3)  or (user_type =2 and trade_type = 2) ) and (trade_status = 100 or (trade_status != 100 and deal_status !=1 ))
+     uid = #{uid,jdbcType=INTEGER} and income_outcome = 1  and deal_status != 1
+     and ( (user_type =1 and trade_type = 3)  or (user_type =2 and trade_type = 2) or (user_type =2 and trade_type = 3) )
   </sql>
 
   <select id="selectCountGoodsIncomeOrCompensateIncomeByUid" resultType="java.lang.Integer" parameterType="java.lang.Integer" >
diff --git a/dal/src/main/resources/META-INF/mybatis/product/StorageMapper.xml b/dal/src/main/resources/META-INF/mybatis/product/StorageMapper.xml
index 1c47803..b3c7c51 100644
--- a/dal/src/main/resources/META-INF/mybatis/product/StorageMapper.xml
+++ b/dal/src/main/resources/META-INF/mybatis/product/StorageMapper.xml
@@ -62,5 +62,25 @@
       update_time = unix_timestamp()
     where id = #{storageId,jdbcType=INTEGER}
   </update>
-  
+  <update id="batchAddStorageNum" parameterType="java.util.List">
+    update storage
+    <trim prefix="set" suffixOverrides=",">
+      <trim prefix="storage_num =case" suffix="end,">
+        <foreach collection="storageList" item="item" index="index">
+          <if test="item.storageNum!=null">
+            when id=#{item.id,jdbcType=INTEGER} then storage_num + #{item.storageNum,jdbcType=INTEGER}
+          </if>
+        </foreach>
+      </trim>
+      <trim prefix="update_time =case" suffix="end,">
+        <foreach collection="storageList" item="item" index="index">
+            when id=#{item.id,jdbcType=INTEGER} then unix_timestamp()
+        </foreach>
+      </trim>
+    </trim>
+    where
+    <foreach collection="storageList" separator="or" item="item" index="index" >
+      id= #{item.id,jdbcType=INTEGER}
+    </foreach>
+  </update>
 </mapper>
\ No newline at end of file
diff --git a/dal/src/main/resources/META-INF/mybatis/product/StoragePriceMapper.xml b/dal/src/main/resources/META-INF/mybatis/product/StoragePriceMapper.xml
index a45978f..17f3a76 100644
--- a/dal/src/main/resources/META-INF/mybatis/product/StoragePriceMapper.xml
+++ b/dal/src/main/resources/META-INF/mybatis/product/StoragePriceMapper.xml
@@ -28,6 +28,21 @@
       #{price,jdbcType=DECIMAL}, #{status,jdbcType=INTEGER}, #{updateTime,jdbcType=INTEGER},
       #{createTime,jdbcType=INTEGER})
   </insert>
+  
+  <insert id="insertBatch">
+    insert into storage_price (skup, product_id, goods_id,
+      storage_id, depot_num, seller_uid, 
+      price, status, update_time, 
+      create_time)
+    values
+    <foreach collection="storagePriceList" item="item" index="index" separator="," >  
+       (#{item.skup,jdbcType=INTEGER}, #{item.productId,jdbcType=INTEGER}, 
+      #{item.goodsId,jdbcType=INTEGER},#{item.storageId,jdbcType=INTEGER}, #{item.depotNum,jdbcType=INTEGER}, #{item.sellerUid,jdbcType=INTEGER},
+      #{item.price,jdbcType=DECIMAL}, #{item.status,jdbcType=INTEGER}, #{item.updateTime,jdbcType=INTEGER}, 
+      #{item.createTime,jdbcType=INTEGER})
+    </foreach>
+  </insert>
+  
   <update id="updateByPrimaryKey" parameterType="com.yohoufo.dal.product.model.StoragePrice">
     update storage_price
     set skup = #{skup,jdbcType=INTEGER},
@@ -81,6 +96,16 @@
       #{item}
     </foreach>
   </select>
+  <select id="selectBySkupList" resultMap="BaseResultMap">
+    select id, skup, product_id, goods_id, storage_id, depot_num, seller_uid, price, status,
+    update_time, create_time
+    from storage_price
+    where skup in 
+    <foreach item="item" index="index" collection="skupList"
+             open="(" separator="," close=")">
+      #{item}
+    </foreach>
+  </select>
   <update id="updateStatus">
     update storage_price set status = #{status,jdbcType=INTEGER},
       update_time = unix_timestamp()
@@ -95,5 +120,12 @@
     where skup = #{skup,jdbcType=INTEGER}
 	      and status = 100
   </update>
-
+  <update id="batchUpdateStatus">
+    update storage_price set status = #{status,jdbcType=INTEGER},
+      update_time = unix_timestamp()
+    where skup in 
+    <foreach item="skup" index="index" collection="skupList" open="(" separator="," close=")">
+      #{skup}
+    </foreach>
+  </update>
 </mapper>
\ No newline at end of file
diff --git a/order/src/main/java/com/yohoufo/order/common/TransferCase.java b/order/src/main/java/com/yohoufo/order/common/TransferCase.java
index adf893a..969e444 100644
--- a/order/src/main/java/com/yohoufo/order/common/TransferCase.java
+++ b/order/src/main/java/com/yohoufo/order/common/TransferCase.java
@@ -1,11 +1,15 @@
 package com.yohoufo.order.common;
 
+import java.util.Map;
+
 /**
  * 1:鉴定通过(货款-->卖家 + 平台);
  *  2:鉴定不通过(保证金 --> 买家 + 平台);
  *  3:有买家时卖家不卖了(保证金 --> 买家+ 平台)
  *  4:超时发货(保证金 --> 买家 + 平台)
  * Created by chenchao on 2018/10/9.
+ * 5:买家付款后[卖家未发货],取消订单(货款部分-->卖家);
+ *  6:买家付款后[卖家已发货],取消订单(货款部分-->卖家);
  */
 public enum TransferCase {
 
@@ -13,7 +17,9 @@ public enum TransferCase {
     APPRAISE_SUCCESS(1),
     APPRAISE_FAIL(2),
     SELLER_PLAY_BUYER(3),
-    DELIVER_TIME_OUT(4);
+    DELIVER_TIME_OUT(4),
+    BUYER_CANCEL_BEFORE_SELLER_DELIVER(5),
+    BUYER_CANCEL_BEFORE_DEPOT_RECEIVE(6);
 
     private int code;
 
@@ -24,4 +30,16 @@ public enum TransferCase {
     public int getCode() {
         return code;
     }
+
+
+    private static Map<Integer, TransferCase> cache;
+    static {
+        for(TransferCase tc: values()){
+            cache.put(tc.code, tc);
+        }
+    }
+
+    public static TransferCase getTransferCase(Integer code){
+        return cache.get(code);
+    }
 }
diff --git a/order/src/main/java/com/yohoufo/order/controller/SellerOrderController.java b/order/src/main/java/com/yohoufo/order/controller/SellerOrderController.java
index 226ac26..d8c82a5 100644
--- a/order/src/main/java/com/yohoufo/order/controller/SellerOrderController.java
+++ b/order/src/main/java/com/yohoufo/order/controller/SellerOrderController.java
@@ -1,9 +1,8 @@
 package com.yohoufo.order.controller;
 
 import com.yohobuy.ufo.model.order.bo.SoldPrdComputeBo;
-import com.yohobuy.ufo.model.order.req.SellerOrderCancelReq;
-import com.yohobuy.ufo.model.order.req.SellerOrderComputeReq;
-import com.yohobuy.ufo.model.order.req.SellerOrderSubmitReq;
+import com.yohobuy.ufo.model.order.req.*;
+import com.yohobuy.ufo.model.order.resp.BatchChangePriceResp;
 import com.yohoufo.common.ApiResponse;
 import com.yohoufo.common.annotation.IgnoreSession;
 import com.yohoufo.common.annotation.IgnoreSignature;
@@ -11,7 +10,6 @@ import com.yohoufo.common.exception.GatewayException;
 import com.yohoufo.dal.order.model.SellerOrder;
 import com.yohoufo.order.model.response.OrderSubmitResp;
 import com.yohoufo.order.service.handler.SellerOrderComputeHandler;
-import com.yohoufo.order.service.impl.SellerOrderCancelService;
 import com.yohoufo.order.service.impl.SellerOrderService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -34,6 +32,9 @@ public class SellerOrderController {
     @Autowired
     private SellerOrderService sellerOrderService;
 
+    @Autowired
+    private SellerOrderComputeHandler sellerOrderComputeHandler;
+
     /**
      * 根据卖家提交价格来计算各项费用
      * @param uid
@@ -46,8 +47,10 @@ public class SellerOrderController {
     @ResponseBody
     public ApiResponse computePublishPrd(@RequestParam(name = "uid", required = true)int uid,
                                          @RequestParam(name = "storage_id", required = true)int storage_id,
-                                        @RequestParam(name="price", required = true)String price) throws GatewayException {
-        SellerOrderComputeReq req = SellerOrderComputeReq.builder().uid(uid).storageId(storage_id).price(price).build();
+                                        @RequestParam(name="price", required = true)String price,
+                                         @RequestParam(name="num", defaultValue = "1", required = false)int num) throws GatewayException {
+        SellerOrderComputeReq req = SellerOrderComputeReq.builder().uid(uid).storageId(storage_id).price(price)
+                .num(num).build();
         logger.info("in ufo.sellerOrder.computePublishPrd, req {}", req);
         SoldPrdComputeBo computeBo = sellerOrderService.computePublishPrd(req);
         return new ApiResponse.ApiResponseBuilder().code(200).data(computeBo).message("算费成功").build();
@@ -68,7 +71,8 @@ public class SellerOrderController {
     public ApiResponse publishPrd(@RequestParam(name = "uid", required = true)int uid,
                                   @RequestParam(name = "storage_id", required = true)int storage_id,
                                   @RequestParam(name="price", required = true)String price,
-                                  @RequestParam(name="address_id")String address_id) throws GatewayException {
+                                  @RequestParam(name="address_id")String address_id,
+                                  @RequestParam(name="num", defaultValue = "1", required = false)int num) throws GatewayException {
         SellerOrderSubmitReq req = SellerOrderSubmitReq.builder()
                 .uid(uid)
                 .storageId(storage_id)
@@ -80,7 +84,33 @@ public class SellerOrderController {
         return new ApiResponse.ApiResponseBuilder().data(resp).code(200).message("发布成功").build();
     }
 
+    /**
+     * 入驻商家的批量下架
+     * @param uid
+     * @param batchNo
+     * @param num
+     * @return
+     * @throws GatewayException
+     */
+    @RequestMapping(params = "method=ufo.sellerOrder.batchCancel")
+    @ResponseBody
+    public ApiResponse batchCancel(@RequestParam(name = "uid", required = true)int uid,
+                              @RequestParam(name = "batchNo", required = true)String batchNo,
+                                   @RequestParam(name="num", defaultValue = "1", required = false)int num,
+                                   @RequestParam(name = "skupList", required = true)String skupList
 
+    ) throws GatewayException {
+        SellerOrderBatchCancelReq req = SellerOrderBatchCancelReq.builder()
+                .uid(uid).batchNo(batchNo).storageNum(num).skupList(skupList)
+                .build();
+        logger.info("in ufo.sellerOrder.batchCancel, req {}", req);
+        boolean result = sellerOrderService.batchCancel(req);
+        String msg = "批量取消成功";
+        if(!result){
+            msg = "批量取消失败";
+        }
+        return new ApiResponse.ApiResponseBuilder().data(result).code(200).message(msg).build();
+    }
 
 
 
@@ -144,8 +174,7 @@ public class SellerOrderController {
         return new ApiResponse.ApiResponseBuilder().data(result).code(200).message(msg).build();
     }
 
-    @Autowired
-    private SellerOrderComputeHandler sellerOrderComputeHandler;
+
 
     @RequestMapping(params = "method=ufo.skup.earnestMoneyRange")
     @ResponseBody
@@ -154,4 +183,31 @@ public class SellerOrderController {
                 .data(sellerOrderComputeHandler.getEarnestMoneyrange())
                 .message("get EarnestMoneyrange success").build();
     }
+
+    /**
+     * 批量调价
+     * @param uid
+     * @param batchNo
+     * @param price
+     * @return
+     * @throws GatewayException
+     */
+    @RequestMapping(params = "method=ufo.sellerOrder.batchChangePrice")
+    @ResponseBody
+    public ApiResponse batchChangePrice(@RequestParam(name = "uid", required = true)int uid,
+                              @RequestParam(name = "price", required = true)String price,
+                                        @RequestParam(name = "batchNo", required = true)String batchNo,
+                                        @RequestParam(name = "skupList", required = true)String skupList
+
+    ) throws GatewayException {
+        BatchChangePriceReq req = BatchChangePriceReq.builder()
+                .uid(uid).price(price)
+                .batchNo(batchNo).skupList(skupList)
+                .build();
+        logger.info("in ufo.sellerOrder.batchChangePrice, req {}", req);
+        BatchChangePriceResp result = sellerOrderService.batchChangePrice(req);
+
+        return new ApiResponse.ApiResponseBuilder().data(result).code(200).message(result.getTips()).build();
+    }
+
 }
diff --git a/order/src/main/java/com/yohoufo/order/event/BeforeDepotReceiveEvent.java b/order/src/main/java/com/yohoufo/order/event/BeforeDepotReceiveEvent.java
new file mode 100644
index 0000000..ec6d131
--- /dev/null
+++ b/order/src/main/java/com/yohoufo/order/event/BeforeDepotReceiveEvent.java
@@ -0,0 +1,29 @@
+package com.yohoufo.order.event;
+
+import com.yohobuy.ufo.model.order.common.OrderStatus;
+import com.yohoufo.common.alarm.Event;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Builder;
+
+/**
+ * Created by chao.chen on 2018/11/14.
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BeforeDepotReceiveEvent extends Event {
+    private int buyerUid;
+
+    private long orderCode;
+
+    private OrderStatus target;
+
+    private OrderStatus expected;
+
+    private int sellerUid;
+
+    private int skup;
+}
diff --git a/order/src/main/java/com/yohoufo/order/event/BeforeSellerDeliverEvent.java b/order/src/main/java/com/yohoufo/order/event/BeforeSellerDeliverEvent.java
new file mode 100644
index 0000000..8f2e5f6
--- /dev/null
+++ b/order/src/main/java/com/yohoufo/order/event/BeforeSellerDeliverEvent.java
@@ -0,0 +1,27 @@
+package com.yohoufo.order.event;
+
+import com.yohobuy.ufo.model.order.common.OrderStatus;
+import com.yohoufo.common.alarm.Event;
+import lombok.*;
+import lombok.experimental.Builder;
+
+/**
+ * Created by chao.chen on 2018/11/14.
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BeforeSellerDeliverEvent extends Event {
+    private int buyerUid;
+
+    private long orderCode;
+
+    private OrderStatus target;
+
+    private OrderStatus expected;
+
+    private int sellerUid;
+
+    private int skup;
+}
diff --git a/order/src/main/java/com/yohoufo/order/model/request/PaymentRequest.java b/order/src/main/java/com/yohoufo/order/model/request/PaymentRequest.java
index 0d12327..b4011e1 100644
--- a/order/src/main/java/com/yohoufo/order/model/request/PaymentRequest.java
+++ b/order/src/main/java/com/yohoufo/order/model/request/PaymentRequest.java
@@ -1,5 +1,6 @@
 package com.yohoufo.order.model.request;
 
+import com.yohoufo.order.common.RefundCase;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -23,6 +24,10 @@ public class PaymentRequest {
      * 退款金额
      */
     private double refundAmount;
+    
+    private String amount;
 
     private String openid;
+
+    private RefundCase refundCase;
 }
diff --git a/order/src/main/java/com/yohoufo/order/model/request/ShoppingRequest.java b/order/src/main/java/com/yohoufo/order/model/request/ShoppingRequest.java
index c70f5f5..a852760 100644
--- a/order/src/main/java/com/yohoufo/order/model/request/ShoppingRequest.java
+++ b/order/src/main/java/com/yohoufo/order/model/request/ShoppingRequest.java
@@ -37,5 +37,7 @@ public class ShoppingRequest {
      */
     private String channelNo;
 
+    private String amount;
+
 
 }
diff --git a/order/src/main/java/com/yohoufo/order/model/request/TransferMoneyRequest.java b/order/src/main/java/com/yohoufo/order/model/request/TransferMoneyRequest.java
index 49b6eb2..ce00857 100644
--- a/order/src/main/java/com/yohoufo/order/model/request/TransferMoneyRequest.java
+++ b/order/src/main/java/com/yohoufo/order/model/request/TransferMoneyRequest.java
@@ -22,7 +22,10 @@ public class TransferMoneyRequest {
      * <pre>
      *  1:鉴定通过(货款-->卖家); 
      *  2:鉴定不通过(保证金 --> 买家); 
-     *  3:有买家时卖家不卖了(保证金 --> 买家)
+     *  3:有买家时卖家不卖了(保证金 --> 买家);
+     *  // 20181109 add
+     *  4:买家付款后[卖家未发货],取消订单(货款部分-->卖家); 
+     *  5:买家付款后[卖家已发货],取消订单(货款部分-->卖家); 
      *  </pre>
      */
     private int type;
diff --git a/order/src/main/java/com/yohoufo/order/service/handler/BuyerCancelCompensateComputeHandler.java b/order/src/main/java/com/yohoufo/order/service/handler/BuyerCancelCompensateComputeHandler.java
new file mode 100644
index 0000000..6eb5daf
--- /dev/null
+++ b/order/src/main/java/com/yohoufo/order/service/handler/BuyerCancelCompensateComputeHandler.java
@@ -0,0 +1,30 @@
+package com.yohoufo.order.service.handler;
+
+import com.yohoufo.order.service.impl.OrderDynamicConfig;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+
+/**
+ * Created by chao.chen on 2018/11/16.
+ */
+@Component
+public class BuyerCancelCompensateComputeHandler {
+
+    @Resource(name = "orderDynamicConfig")
+    OrderDynamicConfig orderDynamicConfig;
+
+
+    public BigDecimal calBeforeSellerDeliver(){
+        //todo 若后续改成动态配置时,需要实时计算
+        OrderDynamicConfig.BuyerCancelCompensateNode node = orderDynamicConfig.getBeforeSellerDeliverBCCN();
+        return node.getSellerGetMoney();
+    }
+
+    public BigDecimal calBeforeDepotReceive(){
+        //todo 若后续改成动态配置时,需要实时计算
+        OrderDynamicConfig.BuyerCancelCompensateNode node = orderDynamicConfig.getBeforeDepotReceiveBCCN();
+        return node.getSellerGetMoney();
+    }
+}
diff --git a/order/src/main/java/com/yohoufo/order/service/impl/BuyerOrderCancelService.java b/order/src/main/java/com/yohoufo/order/service/impl/BuyerOrderCancelService.java
new file mode 100644
index 0000000..5346a0c
--- /dev/null
+++ b/order/src/main/java/com/yohoufo/order/service/impl/BuyerOrderCancelService.java
@@ -0,0 +1,93 @@
+package com.yohoufo.order.service.impl;
+
+import com.yohobuy.ufo.model.order.common.OrderStatus;
+import com.yohobuy.ufo.model.order.common.SkupStatus;
+import com.yohoufo.common.utils.DateUtil;
+import com.yohoufo.dal.order.BuyerOrderMapper;
+import com.yohoufo.dal.order.SellerOrderGoodsMapper;
+import com.yohoufo.dal.order.model.SellerOrderGoods;
+import com.yohoufo.order.event.BeforeDepotReceiveEvent;
+import com.yohoufo.order.event.BeforeSellerDeliverEvent;
+import com.yohoufo.order.utils.LoggerUtils;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.annotation.Resource;
+
+/**
+ * Created by chao.chen on 2018/11/13.
+ */
+@Service
+public class BuyerOrderCancelService {
+    private Logger logger = LoggerUtils.getOrderCloseLogger();
+
+    @Resource(name = "orderDynamicConfig")
+    private OrderDynamicConfig orderDynamicConfig;
+
+    @Autowired
+    private BuyerOrderMapper buyerOrderMapper;
+
+    @Autowired
+    private SellerOrderGoodsMapper sellerOrderGoodsMapper;
+
+    public void cancel(BeforeSellerDeliverEvent bsdEvent){
+        OrderDynamicConfig.BuyerCancelCompensateNode compensate = orderDynamicConfig.getBeforeSellerDeliverBCCN();
+
+        logger.info("in buyer cancel BeforeSellerDeliver, event {} compensate {}", bsdEvent, compensate);
+        int buyerUid = bsdEvent.getBuyerUid();
+        long orderCode = bsdEvent.getOrderCode();
+        OrderStatus target = bsdEvent.getTarget();
+        OrderStatus expected = bsdEvent.getExpected();
+        int currentTime = DateUtil.getCurrentTimeSecond();
+        int rows = buyerOrderMapper.updateStatusByOrderCode(orderCode, buyerUid, expected.getCode(), target.getCode(), currentTime);
+        if (rows>0) {
+            int skup = bsdEvent.getSkup();
+            SellerOrderGoods targetGoods = new SellerOrderGoods();
+            targetGoods.setId(skup);
+            targetGoods.setStatus(SkupStatus.BUYER_CANCEL_BEFORE_SELLER_DELIVER.getCode());
+            targetGoods.setExceptStatus(SkupStatus.SELL_OUT.getCode());
+            sellerOrderGoodsMapper.updateStatusBySkpu(targetGoods);
+
+            //TODO 整个过程异步去执行(考虑退费依赖订单状态)
+            //(退费)退保证金给卖家
+            //(转账)瓜分指定赔偿款给卖家和平台
+            //(退费)扣除赔偿款,计算剩余的货款,退给买家
+
+        }
+    }
+
+
+    public void cancel(BeforeDepotReceiveEvent bdrEvent){
+        OrderDynamicConfig.BuyerCancelCompensateNode compensate = orderDynamicConfig.getBeforeDepotReceiveBCCN();
+        logger.info("in buyer cancel BeforeDepotReceive, event {} compensate {}", bdrEvent, compensate);
+
+        OrderStatus target = bdrEvent.getTarget();
+        OrderStatus expected = bdrEvent.getExpected();
+        int buyerUid = bdrEvent.getBuyerUid();
+        long orderCode = bdrEvent.getOrderCode();
+        int currentTime = DateUtil.getCurrentTimeSecond();
+        int rows = buyerOrderMapper.updateStatusByOrderCode(orderCode, buyerUid, expected.getCode(), target.getCode(), currentTime);
+        if (rows>0) {
+            int skup = bdrEvent.getSkup();
+            SellerOrderGoods targetGoods = new SellerOrderGoods();
+            targetGoods.setId(skup);
+            targetGoods.setStatus(SkupStatus.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE.getCode());
+            targetGoods.setExceptStatus(SkupStatus.SELL_OUT.getCode());
+            sellerOrderGoodsMapper.updateStatusBySkpu(targetGoods);
+
+            //TODO 整个过程异步去执行(考虑退费依赖订单状态)
+            //(退费)退保证金给卖家
+            //(转账)瓜分指定赔偿款给卖家和平台
+            //(退费)扣除赔偿款,计算剩余的货款,退给买家
+        }
+
+
+    }
+
+
+
+
+}
diff --git a/order/src/main/java/com/yohoufo/order/service/impl/BuyerOrderListServiceImpl.java b/order/src/main/java/com/yohoufo/order/service/impl/BuyerOrderListServiceImpl.java
index bc4c5a0..dbcf199 100644
--- a/order/src/main/java/com/yohoufo/order/service/impl/BuyerOrderListServiceImpl.java
+++ b/order/src/main/java/com/yohoufo/order/service/impl/BuyerOrderListServiceImpl.java
@@ -4,15 +4,14 @@ import com.yoho.error.ServiceError;
 import com.yoho.error.exception.ServiceException;
 import com.yohobuy.ufo.model.order.common.OrderStatus;
 import com.yohobuy.ufo.model.order.resp.OrderListInfo;
+import com.yohobuy.ufo.model.order.common.OrderListType;
 import com.yohoufo.common.helper.ImageUrlAssist;
 import com.yohoufo.dal.order.BuyerOrderGoodsMapper;
 import com.yohoufo.dal.order.BuyerOrderMapper;
-import com.yohoufo.dal.order.BuyerOrderMetaMapper;
 import com.yohoufo.dal.order.SellerOrderGoodsMapper;
 import com.yohoufo.dal.order.model.BuyerOrder;
 import com.yohoufo.dal.order.model.BuyerOrderGoods;
 import com.yohoufo.dal.order.model.SellerOrderGoods;
-import com.yohobuy.ufo.model.order.common.OrderListType;
 import com.yohoufo.order.model.request.OrderListRequest;
 import com.yohoufo.order.service.IOrderListService;
 import org.apache.commons.collections.CollectionUtils;
@@ -40,8 +39,6 @@ public class BuyerOrderListServiceImpl extends AbsOrderListService implements IO
     @Autowired
     SellerOrderGoodsMapper sellerOrderGoodsMapper;
 
-    @Autowired
-    BuyerOrderMetaMapper buyerOrderMetaMapper;
     /**
      * 根据type获取 指定的状态
      * @param request
diff --git a/order/src/main/java/com/yohoufo/order/service/impl/BuyerOrderServiceImpl.java b/order/src/main/java/com/yohoufo/order/service/impl/BuyerOrderServiceImpl.java
index 878b70c..d1f4f92 100644
--- a/order/src/main/java/com/yohoufo/order/service/impl/BuyerOrderServiceImpl.java
+++ b/order/src/main/java/com/yohoufo/order/service/impl/BuyerOrderServiceImpl.java
@@ -19,6 +19,8 @@ import com.yohoufo.dal.order.model.BuyerOrderGoods;
 import com.yohoufo.dal.order.model.SellerOrderGoods;
 import com.yohoufo.order.common.ActionStatusHold;
 import com.yohoufo.order.common.DelStatus;
+import com.yohoufo.order.event.BeforeDepotReceiveEvent;
+import com.yohoufo.order.event.BeforeSellerDeliverEvent;
 import com.yohoufo.order.model.request.OrderListRequest;
 import com.yohoufo.order.model.request.OrderRequest;
 import com.yohoufo.order.model.response.OrderDetailInfo;
@@ -71,6 +73,9 @@ public class BuyerOrderServiceImpl implements IBuyerOrderService {
     @Autowired
     private CacheCleaner cacheCleaner;
 
+    @Autowired
+    private BuyerOrderCancelService buyerOrderCancelService;
+
     /**
      * 提交订单
      * @param orderRequest
@@ -78,7 +83,8 @@ public class BuyerOrderServiceImpl implements IBuyerOrderService {
     public void confirm(OrderRequest orderRequest){
         OrderStatus expectStatus = OrderStatus.WAITING_RECEIVE;
         // 参数检查 ![待收货] 不合法
-        DataNode node = checkStatusAndRequest(orderRequest, expectStatus);
+        DataNode node = checkBase(orderRequest);
+        checkStatus(node,orderRequest, expectStatus);
         int uid;
         long orderCode;
         int sellerUid = node.buyerOrderInDB.getSellerUid();
@@ -105,9 +111,7 @@ public class BuyerOrderServiceImpl implements IBuyerOrderService {
     @Override
     public void cancel(OrderRequest orderRequest){
     	logger.info("Buyer Order cancel (OrderRequest)  {}", orderRequest);
-        OrderStatus expectStatus = OrderStatus.WAITING_PAY;
-        OrderStatus targetStatus = OrderStatus.BUYER_CANCEL_BEFORE_PAY;
-        cancelBeforePaid(orderRequest, expectStatus, targetStatus);
+        doCancel(orderRequest);
     }
 
     @Override
@@ -115,14 +119,59 @@ public class BuyerOrderServiceImpl implements IBuyerOrderService {
         logger.info("Buyer Order cancel time out ,(OrderRequest)  {}", orderRequest);
         OrderStatus expectStatus = OrderStatus.WAITING_PAY;
         OrderStatus targetStatus = OrderStatus.BUYER_CANCEL_TIMEOUT;
-        cancelBeforePaid(orderRequest, expectStatus, targetStatus);
+        DataNode node = checkBase(orderRequest);
+        cancelBeforePaid(orderRequest, node, expectStatus, targetStatus);
     }
 
+    private void doCancel(OrderRequest orderRequest){
+        DataNode node = checkBase(orderRequest);
+        BuyerOrder buyerOrder = node.buyerOrderInDB;
+        Integer orderStatus = buyerOrder.getStatus();
+        OrderStatus expectStatus = null ;
+        if (orderStatus == null || (expectStatus = OrderStatus.getOrderStatus(orderStatus))== null){
+            logger.warn("in buyer cancel check orderStatus fail, orderStatus {} expectStatus {}", orderStatus,expectStatus );
+            throw new ServiceException(ServiceError.ORDER_STATUS_INVALIDATE);
+        }
+        logger.info("in buyer cancel, req {} expectStatus {}", orderRequest, expectStatus);
+        //case 1 :支付前
+        //case 2 :支付后,卖家发货前
+        //case 3 :卖家发货后,鉴定中心接受前
+        OrderStatus targetStatus;
+        switch (expectStatus){
+            case WAITING_PAY:
+                targetStatus = OrderStatus.BUYER_CANCEL_BEFORE_PAY;
+                cancelBeforePaid(orderRequest, node, expectStatus, targetStatus);
+                break;
+            case HAS_PAYED:
+                BuyerOrderGoods bog = buyerOrderGoodsMapper.selectByOrderCode(orderRequest.getUid(),
+                        orderRequest.getOrderCode());
+                int skup = bog.getSkup();
+                targetStatus = OrderStatus.BUYER_CANCEL_BEFORE_SELLER_DELIVER;
+                BeforeSellerDeliverEvent bsde = BeforeSellerDeliverEvent.builder()
+                        .buyerUid(orderRequest.getUid()).orderCode(orderRequest.getOrderCode())
+                        .expected(expectStatus).target(targetStatus).skup(skup).sellerUid(buyerOrder.getSellerUid())
+                        .build();
+                buyerOrderCancelService.cancel(bsde);
+                break;
+            case SELLER_SEND_OUT:
+                bog = buyerOrderGoodsMapper.selectByOrderCode(orderRequest.getUid(),
+                        orderRequest.getOrderCode());
+                skup = bog.getSkup();
+                targetStatus = OrderStatus.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE;
+                BeforeDepotReceiveEvent bdre = BeforeDepotReceiveEvent.builder()
+                        .buyerUid(orderRequest.getUid()).orderCode(orderRequest.getOrderCode())
+                        .expected(expectStatus).target(targetStatus).skup(skup).sellerUid(buyerOrder.getSellerUid())
+                        .build();
+                buyerOrderCancelService.cancel(bdre);
+                break;
+        }
+
+    }
 
 
-    public void cancelBeforePaid(OrderRequest orderRequest, OrderStatus exceptStatus, OrderStatus targetStatus){
+    public void cancelBeforePaid(OrderRequest orderRequest, DataNode dataNode, OrderStatus exceptStatus, OrderStatus targetStatus){
         // 状态 ![待付款] 不合法
-        DataNode dataNode = checkStatusAndRequest(orderRequest, exceptStatus);
+       checkStatus(dataNode, orderRequest, exceptStatus);
 
         // 更新订单状态
         final OrderStatus orderStatus = targetStatus;
@@ -166,12 +215,8 @@ public class BuyerOrderServiceImpl implements IBuyerOrderService {
     private class DataNode{
         BuyerOrder buyerOrderInDB;
     }
-    /**
-     *
-     * @param orderRequest
-     * @param orderStatusEx
-     */
-    private DataNode checkStatusAndRequest(OrderRequest orderRequest, OrderStatus orderStatusEx ) {
+
+    private DataNode checkBase(OrderRequest orderRequest){
         // 参数检查
         if (orderRequest.getUid() < 0
                 || orderRequest.getOrderCode() < 0){
@@ -187,7 +232,19 @@ public class BuyerOrderServiceImpl implements IBuyerOrderService {
                     orderRequest.getUid(), orderRequest.getOrderCode() );
             throw new ServiceException(ServiceError.ORDER_NULL);
         }
+        DataNode node = new DataNode();
+        node.buyerOrderInDB = buyerOrder;
+        return node;
+    }
+    /**
+     *
+     * @param orderRequest
+     * @param orderStatusEx
+     */
+    private void checkStatus(DataNode node, OrderRequest orderRequest, OrderStatus orderStatusEx ) {
+
 
+        BuyerOrder buyerOrder = node.buyerOrderInDB;
         // 检查 订单状态
         int status = buyerOrder.getStatus() == null ? -1 : buyerOrder.getStatus().intValue();
         OrderStatus orderStatus = OrderStatus.getOrderStatus(status);
@@ -196,9 +253,6 @@ public class BuyerOrderServiceImpl implements IBuyerOrderService {
                     orderRequest.getUid(), orderRequest.getOrderCode(), buyerOrder.getStatus());
             throw new ServiceException(ServiceError.ORDER_STATUS_INVALIDATE);
         }
-        DataNode node = new DataNode();
-        node.buyerOrderInDB = buyerOrder;
-        return node;
     }
 
 
diff --git a/order/src/main/java/com/yohoufo/order/service/impl/OrderDynamicConfig.java b/order/src/main/java/com/yohoufo/order/service/impl/OrderDynamicConfig.java
new file mode 100644
index 0000000..944da89
--- /dev/null
+++ b/order/src/main/java/com/yohoufo/order/service/impl/OrderDynamicConfig.java
@@ -0,0 +1,107 @@
+package com.yohoufo.order.service.impl;
+
+import com.yohoufo.common.utils.BigDecimalHelper;
+import lombok.Data;
+import lombok.Getter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.math.BigDecimal;
+
+/**
+ * Created by chao.chen on 2018/11/15.
+ */
+@Component("orderDynamicConfig")
+
+public class OrderDynamicConfig {
+
+    final private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Data
+    public static class BuyerCancelCompensateNode{
+        /**
+         * 卖家赔偿金额
+         */
+        private BigDecimal buyerCompensateMoney;
+        /**
+         * 卖家获取的赔偿金额
+         */
+        private BigDecimal sellerGetMoney;
+        /**
+         * 赔偿比例
+         */
+        private BigDecimal compensateRate;
+
+        public BuyerCancelCompensateNode(BigDecimal buyerCompensateMoney, BigDecimal compensateRate) {
+            this.buyerCompensateMoney = buyerCompensateMoney;
+            this.compensateRate = compensateRate;
+            this.sellerGetMoney = BigDecimalHelper.halfUp(buyerCompensateMoney.multiply(compensateRate));
+        }
+    }
+
+    /**
+     * 卖家发货前
+     */
+    @Value("${order.buyer.cancelWhenSellerUnDelivery.money}")
+    private String buyerCancelUnDelivery;
+    @Value("${order.buyer.cancelWhenSellerUnDelivery.sellerGetMoneyRate}")
+    private String sellerGetRateUnDelivery;
+    /**
+     * 卖家发货后 鉴定中心收货前
+     */
+    @Value("${order.buyer.cancelWhenSellerDelivery.money}")
+    private String buyerCancelDelivery;
+    @Value("${order.buyer.cancelWhenSellerDelivery.sellerGetMoneyRate}")
+    private String sellerGetRateDelivery;
+
+    /**
+     * 卖家发货,买家赔偿金额 比例 ,卖家获取金额
+     */
+    @Getter
+    private BuyerCancelCompensateNode beforeSellerDeliverBCCN;
+    /**
+     * 卖家未发货,买家赔偿金额
+     */
+    @Getter
+    private BuyerCancelCompensateNode beforeDepotReceiveBCCN;
+
+
+    @PostConstruct
+    private void init() {
+        BigDecimal buyerCancelUnDeliveryMoney , beforeSellerDeliverRate;
+        BigDecimal buyerCancelDeliveryMoney, beforeDepotReceiveRate;
+        try {
+            buyerCancelDeliveryMoney = new BigDecimal(buyerCancelUnDelivery);
+            beforeSellerDeliverRate = new BigDecimal( sellerGetRateUnDelivery);
+
+            //包装结构时做格式化,之前请保留有效位
+            beforeSellerDeliverBCCN  = new BuyerCancelCompensateNode(BigDecimalHelper.halfUp(buyerCancelDeliveryMoney),
+                    BigDecimalHelper.halfUp(beforeSellerDeliverRate) );
+
+            buyerCancelUnDeliveryMoney = new BigDecimal(buyerCancelDelivery);
+            beforeDepotReceiveRate = new BigDecimal(sellerGetRateDelivery);
+            beforeDepotReceiveBCCN = new BuyerCancelCompensateNode(buyerCancelUnDeliveryMoney, beforeDepotReceiveRate);
+        } catch (Exception e) {
+            logger.error("买家取消罚款金额相关参数配置错误!", e);
+            throw new Error("买家取消罚款金额相关参数配置错误!");
+        }
+        if (buyerCancelDeliveryMoney.compareTo(BigDecimal.ZERO) < 0) {
+            throw new Error("buyerCancelDeliveryMoney买家取消(货已寄出)罚款金额不能为负数");
+        }
+        if (buyerCancelUnDeliveryMoney.compareTo(BigDecimal.ZERO) < 0) {
+            throw new Error("buyerCancelUnDeliveryMoney买家取消(货未寄出)罚款金额不能为负数");
+        }
+        if (beforeDepotReceiveRate.compareTo(BigDecimal.ZERO) < 0
+                || beforeDepotReceiveRate.compareTo(BigDecimal.ONE) > 0) {
+            throw new Error("sellerGetRateDeliveryMoney买家取消(货已寄出)卖家获得赔偿比率必须在[0,1]");
+        }
+        if (beforeSellerDeliverRate.compareTo(BigDecimal.ZERO) < 0
+                || beforeSellerDeliverRate.compareTo(BigDecimal.ONE) > 0) {
+            throw new Error("sellerGetRateUnDeliveryMoney买家取消(货未寄出)卖家获得赔偿比率必须在[0,1]");
+        }
+    }
+
+}
diff --git a/order/src/main/java/com/yohoufo/order/service/impl/PaymentServiceImpl.java b/order/src/main/java/com/yohoufo/order/service/impl/PaymentServiceImpl.java
index 862f4ae..c2edbd7 100644
--- a/order/src/main/java/com/yohoufo/order/service/impl/PaymentServiceImpl.java
+++ b/order/src/main/java/com/yohoufo/order/service/impl/PaymentServiceImpl.java
@@ -17,6 +17,7 @@ import com.yohoufo.common.utils.TimeUtils;
 import com.yohoufo.dal.order.*;
 import com.yohoufo.dal.order.model.*;
 import com.yohoufo.order.common.Payment;
+import com.yohoufo.order.common.TransferCase;
 import com.yohoufo.order.constants.RefundContant;
 import com.yohoufo.order.model.PayQueryBo;
 import com.yohoufo.order.model.PayRefundBo;
@@ -29,6 +30,7 @@ import com.yohoufo.order.service.AbstractOrderPaymentService;
 import com.yohoufo.order.service.BuyerOrderPaymentService;
 import com.yohoufo.order.service.IPaymentService;
 import com.yohoufo.order.service.SellerOrderPaymentService;
+import com.yohoufo.order.service.handler.BuyerCancelCompensateComputeHandler;
 import com.yohoufo.order.service.pay.AbstractPayService;
 import com.yohoufo.order.service.pay.alipay.AlipayOuyinService;
 import com.yohoufo.order.service.pay.weixin.WeixinMiniappPayService;
@@ -41,15 +43,29 @@ import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.Date;
 
+import javax.annotation.PostConstruct;
+
 
 @Service
 public class PaymentServiceImpl implements IPaymentService {
+    public enum TargetUserType {
+        buyer(1),seller(2);
+        int code;
+
+        TargetUserType(int code) {
+            this.code = code;
+        }
 
+        public int getCode() {
+            return code;
+        }
+    }
     private static final Logger logger = LoggerUtils.getPayConfirmLogger();
 
 
@@ -101,7 +117,11 @@ public class PaymentServiceImpl implements IPaymentService {
     @Autowired
     TradeBillsMapper tradeBillsMapper;
 
+    @Autowired
+    private BuyerCancelCompensateComputeHandler buyerCancelCompensateComputeHandler;
+    
 
+    
     /**
      * 获取主场的订单service
      * @param codeMeta
@@ -123,6 +143,9 @@ public class PaymentServiceImpl implements IPaymentService {
 
         }else if(codeMeta.getType() == OrderCodeType.SELLER_TYPE.getType()){
             paymentService = this.sellerOrderPaymentService;
+        }else if(codeMeta.getType() == OrderCodeType.SELLER_RECHARGE_EARNEST_TYPE.getType()){
+        	// TODO
+            paymentService = this.sellerOrderPaymentService;
         }
 
         return paymentService;
@@ -402,11 +425,15 @@ public class PaymentServiceImpl implements IPaymentService {
     }
 
 
+
     /**
      * <pre>
      *  1:鉴定通过(货款-->卖家); 
      *  2:鉴定不通过(保证金 --> 买家); 
      *  3:有买家时卖家不卖了(保证金 --> 买家)
+     *  // 20181109 add
+     *  4:买家付款后[卖家未发货],取消订单(货款部分-->卖家); 
+     *  5:买家付款后[卖家已发货],取消订单(货款部分-->卖家); 
      *  </pre>
      * 
      * @param request 请求
@@ -414,18 +441,17 @@ public class PaymentServiceImpl implements IPaymentService {
 	@Database(ForceMaster = true)
     public void transferMon(TransferMoneyRequest request){
     	logger.info("transferMon转账开始,request = {}", request);
-    	
     	long buyerOrderCode = request.getBuyerOrderCode();
-    	int transferType = request.getType();
-    	
     	logger.info("transferMon参数检查");
     	// 订单号check
-		if (buyerOrderCode < 1) {
+		if (buyerOrderCode < 1L) {
 			logger.warn("transferMonErr orderCode empty");
 			throw new ServiceException(ServiceError.ORDER_REQUEST_PARM_IS_EMPTY);
 		}
         // 类型检查
-		if (transferType < 1 || transferType > 3) {
+        int transferType = request.getType();
+        TransferCase transferCase = TransferCase.getTransferCase(transferType);
+		if (transferCase == null) {
 			logger.warn("transferMonErr transferType invalid");
 			throw new ServiceException(ServiceError.ORDER_REQUEST_PARM_IS_EMPTY);
 		}
@@ -451,7 +477,10 @@ public class PaymentServiceImpl implements IPaymentService {
         }
         
     	long sellerOrderCode = sellerOrder.getOrderCode();
-		Integer targetUid = transferType == 1 ? sellerOrder.getUid() : buyerOrder.getUid();
+        TargetUserType targetUserType = (transferType == TransferCase.APPRAISE_FAIL.getCode()
+                || transferType == TransferCase.SELLER_PLAY_BUYER.getCode()) ? TargetUserType.buyer : TargetUserType.seller;
+    	//Integer targetUserType = (transferType == 2 || transferType == 3) ? 1 : 2;
+		Integer targetUid = targetUserType == TargetUserType.buyer ? buyerOrder.getUid() : sellerOrder.getUid();
 		
 		if (targetUid == null || targetUid < 1) {
 			logger.warn("transferMonErr uid {} 不合法", targetUid);
@@ -488,11 +517,11 @@ public class PaymentServiceImpl implements IPaymentService {
 		TradeBills record = new TradeBills();
 		record.setUid(targetUid);
 		record.setOrderCode(buyerOrderCode);
-		record.setUserType(transferType == 1 ? 2 : 1);
+		record.setUserType(targetUserType.getCode());
 		record.setPayType(1);
 		record.setTradeType(transferType == 1 ? 2 : 3);
 		record.setIncomeOutcome(1);
-		record.setTradeStatus(transferType == 1 ? 0 : 1);
+		record.setTradeStatus(0);
 		record.setCreateTime(now);
 		
 		logger.info("transferMon参数检查成功!");
@@ -500,7 +529,7 @@ public class PaymentServiceImpl implements IPaymentService {
 		
 		logger.info("transferMon插入初始化转账信息成功,接下来计算费用");
 		// 算费
-        BigDecimal transferAmount = calcTransferAmount(sellerOrder.getUid(), sellerOrder.getSkup(), transferType);
+        BigDecimal transferAmount = calcTransferAmount(sellerOrder.getUid(), sellerOrder.getSkup(), transferCase);
         logger.info("transferMon计算费用结果为 {}", transferAmount);
 		if (transferAmount == null) {
 			logger.warn("transferMonErr transferMon计算费用结果为 null, 不合法的金额");
@@ -590,7 +619,7 @@ public class PaymentServiceImpl implements IPaymentService {
             throw new ServiceException(ServiceError.ORDER_REQUEST_PARM_IS_EMPTY);
         }
         // 类型检查
-        if (transferType < 1 || transferType > 3) {
+        if (transferType < 1 || transferType > 5) {
             logger.warn("transferMonErr transferType invalid");
             throw new ServiceException(ServiceError.ORDER_REQUEST_PARM_IS_EMPTY);
         }
@@ -897,9 +926,23 @@ public class PaymentServiceImpl implements IPaymentService {
 		addTradeBills(record);
     }
     
+    private BigDecimal getBuyerCancelBeforeSellerDeliver(){
+        //todo
+        return buyerCancelCompensateComputeHandler.calBeforeSellerDeliver();
+    }
+    private BigDecimal getBuyerCancelBeforeDepotReceive(){
+        //todo
+        return buyerCancelCompensateComputeHandler.calBeforeDepotReceive();
+    }
 
-
-	private BigDecimal calcTransferAmount(Integer sellerUid, Integer skup, int transferType) {
+	private BigDecimal calcTransferAmount(Integer sellerUid, Integer skup, TransferCase transferCase) {
+		if (transferCase == TransferCase.BUYER_CANCEL_BEFORE_SELLER_DELIVER) {
+			return getBuyerCancelBeforeSellerDeliver();
+		}
+		if (transferCase == TransferCase.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE) {
+			return getBuyerCancelBeforeDepotReceive();
+		}
+		
 		SellerOrderMeta meta = sellerOrderMetaMapper.selectByMetaKey(sellerUid, skup, "fee");
 		if (meta == null) {
 			logger.warn("查询SellerOrderMeta无数据, sellerUid is {}, skup is {}", sellerUid, skup);
@@ -913,7 +956,7 @@ public class PaymentServiceImpl implements IPaymentService {
 		try {
 			JSONObject metavalue = JSON.parseObject(meta.getMetaValue());
 			// 交易成功的情况
-			if (transferType == 1) {
+			if (transferCase == TransferCase.APPRAISE_SUCCESS) {
 				return metavalue.getBigDecimal("income");
 			}
 			// (1-Y)*A
@@ -1023,10 +1066,4 @@ public class PaymentServiceImpl implements IPaymentService {
 
 
 
-
-
-
-
-
-
 }
diff --git a/order/src/main/java/com/yohoufo/order/service/impl/SellerOrderDetailService.java b/order/src/main/java/com/yohoufo/order/service/impl/SellerOrderDetailService.java
index 39f56d2..eaa4cf3 100644
--- a/order/src/main/java/com/yohoufo/order/service/impl/SellerOrderDetailService.java
+++ b/order/src/main/java/com/yohoufo/order/service/impl/SellerOrderDetailService.java
@@ -4,10 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.yoho.error.ServiceError;
 import com.yoho.error.exception.ServiceException;
 import com.yohobuy.ufo.model.order.bo.SoldPrdComputeBo;
-import com.yohobuy.ufo.model.order.common.OrderCodeType;
-import com.yohobuy.ufo.model.order.common.OrderStatus;
-import com.yohobuy.ufo.model.order.common.SkupStatus;
-import com.yohobuy.ufo.model.order.common.TabType;
+import com.yohobuy.ufo.model.order.common.*;
 import com.yohobuy.ufo.model.order.resp.ExpressInfoDetail;
 import com.yohobuy.ufo.model.order.resp.ExpressInfoRespBo;
 import com.yohoufo.common.constant.ExpressInfoConstant;
@@ -26,6 +23,7 @@ import com.yohoufo.order.model.response.GoodsInfo;
 import com.yohoufo.order.model.response.OrderDetailInfo;
 import com.yohoufo.order.service.IOrderDetailService;
 import com.yohoufo.order.service.cache.OrderCacheService;
+import com.yohoufo.order.service.proxy.UserProxyService;
 import com.yohoufo.order.service.support.codegenerator.OrderCodeGenerator;
 import com.yohoufo.order.service.support.codegenerator.bean.CodeMeta;
 
@@ -73,6 +71,9 @@ public class SellerOrderDetailService extends AbsOrderDetailService implements I
     @Autowired
     private OrderCacheService orderCacheService;
 
+    @Autowired
+    private UserProxyService userProxyService;
+
     private static List<SkupStatus> noNeedShowOrderCode = Arrays.asList(SkupStatus.CAN_NOT_SELL,SkupStatus.CAN_SELL,
             SkupStatus.SELF_CANCEL_PAY, SkupStatus.TIMEOUT_CANCEL,
             SkupStatus.SELLER_CANCEL_SELL, SkupStatus.YOHO_CANCEL_SELL);
@@ -103,12 +104,14 @@ public class SellerOrderDetailService extends AbsOrderDetailService implements I
                     logger.warn("can not find seller order, req {}", orderRequest);
                     return null;
                 }
+                boolean isEntry = userProxyService.isEntryShop(uid);
+                SellerType sellerType = isEntry ? SellerType.ENTRY : SellerType.COMMON;
                 Integer skup = sellerOrder.getSkup();
                 SellerOrderGoods sellerOrderGoods = sellerOrderGoodsMapper.selectByPrimaryKey(skup);
                 Integer skupStatusCode = sellerOrderGoods.getStatus();
                 SkupStatus skupStatus = SkupStatus.getSkupStatus(skupStatusCode);
                 AddressInfo addressInfo = sellerAddressService.getHiddenAddressInfo(uid, skup);
-                orderDetailInfo = buildOrderDetail(sellerOrder, skupStatus, sellerOrderGoods, addressInfo);
+                orderDetailInfo = buildOrderDetail(sellerOrder, skupStatus, sellerOrderGoods, addressInfo, sellerType);
             }else{
                 orderDetailInfo = super.getOrderDetail(orderRequest);
             }
@@ -273,12 +276,13 @@ public class SellerOrderDetailService extends AbsOrderDetailService implements I
     }
 
     private OrderDetailInfo buildOrderDetail(SellerOrder order, SkupStatus skupStatus,
-                                             SellerOrderGoods sellerOrderGoods, AddressInfo addressInfo
+                                             SellerOrderGoods sellerOrderGoods, AddressInfo addressInfo,
+                                             SellerType sellerType
     ) {
         OrderDetailInfo orderDetailInfo = new OrderDetailInfo();
         orderDetailInfo.setUid(order.getUid());
         orderDetailInfo.setOrderCode(getOrderCode(skupStatus, order));
-        orderDetailInfo.setButtons(skupStatus.getDetailButtons());
+        orderDetailInfo.setButtons(skupStatus.getDetailButtons(sellerType));
         orderDetailInfo.setSubmitOrderTimeStr(DateUtil.formatDate(order.getCreateTime(), DateUtil.yyyy_MM_dd_HH_mm_SS));
         orderDetailInfo.setUserAddress(addressInfo);
         //卖家
diff --git a/order/src/main/java/com/yohoufo/order/service/impl/SellerOrderListService.java b/order/src/main/java/com/yohoufo/order/service/impl/SellerOrderListService.java
index 08e3c03..8ff47c6 100644
--- a/order/src/main/java/com/yohoufo/order/service/impl/SellerOrderListService.java
+++ b/order/src/main/java/com/yohoufo/order/service/impl/SellerOrderListService.java
@@ -5,6 +5,7 @@ import com.yoho.error.exception.ServiceException;
 import com.yohobuy.ufo.model.order.bo.GoodsInfo;
 import com.yohobuy.ufo.model.order.common.SellerOrderListType;
 import com.yohobuy.ufo.model.order.common.SellerOrderStatus;
+import com.yohobuy.ufo.model.order.common.SellerType;
 import com.yohobuy.ufo.model.order.common.SkupStatus;
 import com.yohobuy.ufo.model.order.resp.OrderListInfo;
 import com.yohobuy.ufo.model.order.resp.PageResp;
@@ -22,6 +23,7 @@ import com.yohoufo.dal.order.model.SellerOrderGoods;
 import com.yohoufo.order.model.request.OrderListRequest;
 import com.yohoufo.order.service.IOrderListService;
 import com.yohoufo.order.service.cache.OrderCacheService;
+import com.yohoufo.order.service.proxy.UserProxyService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -54,6 +56,9 @@ public class SellerOrderListService extends AbsOrderListService implements IOrde
     @Autowired
     private OrderCacheService orderCacheService;
 
+    @Autowired
+    private UserProxyService userProxyService;
+
 
     @Override
     public PageResp<OrderListInfo> getOrderList(OrderListRequest request){
@@ -73,7 +78,8 @@ public class SellerOrderListService extends AbsOrderListService implements IOrde
         int type;
         if ((type=request.getType()) == SellerOrderListType.IN_SALE.getType()){
             List<Integer> statusList = initOrderListRequest(request);
-
+            boolean isEntry = userProxyService.isEntryShop(request.getUid());
+            final SellerType sellerType = isEntry ? SellerType.ENTRY : SellerType.COMMON;
             int total = sellerOrderGoodsMapper.selectCntByUidStatusList(request.getUid(), statusList);
             int limit = request.getLimit();
             respBuilder = PageResp.builder()
@@ -98,7 +104,7 @@ public class SellerOrderListService extends AbsOrderListService implements IOrde
             List<SellerOrder> sellerOrders = sellerOrderMapper.selectBySkups(skupList);
             List<OrderListInfo> data ;
             data = sellerOrders.parallelStream()
-                    .map(sellerOrder -> buildOrderListInfo(skupSellerOrderGoodsMap.get(sellerOrder.getSkup()), sellerOrder))
+                    .map(sellerOrder -> buildOrderListInfo(skupSellerOrderGoodsMap.get(sellerOrder.getSkup()), sellerOrder, sellerType))
                     .filter(oli -> Objects.nonNull(oli))
                     .collect(Collectors.toList());
 
@@ -132,7 +138,7 @@ public class SellerOrderListService extends AbsOrderListService implements IOrde
     }
 
     OrderListInfo buildOrderListInfo(SellerOrderGoods sellerOrderGoods,
-                                     SellerOrder sellerOrder) {
+                                     SellerOrder sellerOrder, SellerType sellerType) {
 
         OrderListInfo orderListInfo = new OrderListInfo();
         orderListInfo.setUid(sellerOrder.getUid());
@@ -152,7 +158,7 @@ public class SellerOrderListService extends AbsOrderListService implements IOrde
         orderListInfo.setStatuStr(skupStatus.getDesc());
 
         // 按钮显示
-        orderListInfo.setButtons(skupStatus.getListButtons());
+        orderListInfo.setButtons(skupStatus.getListButtons(sellerType));
 
         // 当订单状态是待付款, 显示leftTime
         if (sellerOrderGoods.getStatus() == SkupStatus.CAN_NOT_SELL.getCode()){
diff --git a/order/src/main/java/com/yohoufo/order/service/impl/SellerOrderService.java b/order/src/main/java/com/yohoufo/order/service/impl/SellerOrderService.java
index 102e20c..41c025a 100644
--- a/order/src/main/java/com/yohoufo/order/service/impl/SellerOrderService.java
+++ b/order/src/main/java/com/yohoufo/order/service/impl/SellerOrderService.java
@@ -2,33 +2,35 @@ package com.yohoufo.order.service.impl;
 
 import com.yoho.error.ServiceError;
 import com.yoho.error.exception.ServiceException;
+import com.yohobuy.ufo.model.order.bo.GoodsInfo;
 import com.yohobuy.ufo.model.order.bo.SoldPrdComputeBo;
 import com.yohobuy.ufo.model.order.common.*;
-import com.yohobuy.ufo.model.order.req.SellerOrderCancelReq;
-import com.yohobuy.ufo.model.order.req.SellerOrderComputeReq;
-import com.yohobuy.ufo.model.order.req.SellerOrderSubmitReq;
+import com.yohobuy.ufo.model.order.req.*;
+import com.yohobuy.ufo.model.order.resp.BatchChangePriceResp;
 import com.yohobuy.ufo.model.order.resp.OrderCntResp;
+import com.yohobuy.ufo.model.order.resp.OrderListInfo;
 import com.yohobuy.ufo.model.order.resp.PageResp;
 import com.yohoufo.common.alarm.EventBusPublisher;
 import com.yohoufo.common.alarm.SmsAlarmEvent;
 import com.yohoufo.common.exception.GatewayException;
-import com.yohoufo.common.utils.AddressUtil;
 import com.yohoufo.common.utils.DateUtil;
-import com.yohoufo.dal.order.*;
-import com.yohoufo.dal.order.model.*;
-import com.yohoufo.order.common.*;
+import com.yohoufo.dal.order.BuyerOrderMapper;
+import com.yohoufo.dal.order.SellerOrderGoodsMapper;
+import com.yohoufo.dal.order.SellerOrderMapper;
+import com.yohoufo.dal.order.model.BuyerOrder;
+import com.yohoufo.dal.order.model.SellerOrder;
+import com.yohoufo.dal.order.model.SellerOrderGoods;
+import com.yohoufo.order.common.ActionStatusHold;
+import com.yohoufo.order.common.DelStatus;
 import com.yohoufo.order.convert.SellerOrderConvertor;
 import com.yohoufo.order.event.ErpCancelSellerOrderEvent;
 import com.yohoufo.order.event.EventHandlerContainer;
 import com.yohoufo.order.event.OrderCancelEvent;
-import com.yohoufo.order.model.AddressInfo;
-import com.yohobuy.ufo.model.order.bo.GoodsInfo;
 import com.yohoufo.order.model.SellerOrderContext;
 import com.yohoufo.order.model.dto.SellerOrderComputeResult;
 import com.yohoufo.order.model.request.OrderListRequest;
 import com.yohoufo.order.model.request.OrderRequest;
 import com.yohoufo.order.model.response.OrderDetailInfo;
-import com.yohobuy.ufo.model.order.resp.OrderListInfo;
 import com.yohoufo.order.model.response.OrderSubmitResp;
 import com.yohoufo.order.model.response.OrderSummaryResp;
 import com.yohoufo.order.service.IOrderDetailService;
@@ -37,16 +39,12 @@ import com.yohoufo.order.service.cache.CacheCleaner;
 import com.yohoufo.order.service.cache.OrderCacheService;
 import com.yohoufo.order.service.handler.SellerOrderComputeHandler;
 import com.yohoufo.order.service.handler.SellerOrderSubmitHandler;
+import com.yohoufo.order.service.impl.processor.SellerOrderPrepareProcessor;
 import com.yohoufo.order.service.impl.visitor.OffShelveCancelCase;
 import com.yohoufo.order.service.impl.visitor.UserCancelCase;
 import com.yohoufo.order.service.proxy.ProductProxyService;
-import com.yohoufo.order.service.proxy.UserProxyService;
 import com.yohoufo.order.service.support.codegenerator.OrderCodeGenerator;
 import com.yohoufo.order.service.support.codegenerator.bean.CodeMeta;
-import com.yohoufo.order.utils.AddressHelper;
-import com.yohoufo.product.model.GoodsSize;
-import com.yohoufo.product.model.ProductInfo;
-import com.yohoufo.product.response.StorageDataResp;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -65,7 +63,6 @@ import java.util.stream.Collectors;
 @Slf4j
 public class SellerOrderService  implements IOrderListService, IOrderDetailService {
 
-
     @Autowired
     private SellerOrderMapper sellerOrderMapper;
 
@@ -82,9 +79,6 @@ public class SellerOrderService  implements IOrderListService, IOrderDetailServi
     private SellerOrderSubmitHandler orderSubmitHandler;
 
     @Autowired
-    private UserProxyService userProxyService;
-
-    @Autowired
     private SellerOrderListService sellerOrderListService;
 
     @Autowired
@@ -108,16 +102,27 @@ public class SellerOrderService  implements IOrderListService, IOrderDetailServi
     @Autowired
     private CacheCleaner cacheCleaner;
 
+    @Autowired
+    private SellerOrderPrepareProcessor sellerOrderPrepareProcessor;
 
     public SoldPrdComputeBo computePublishPrd(SellerOrderComputeReq req) throws GatewayException {
         log.info("in computePublishPrd, req {}", req);
-
+        int uid = req.getUid();
+        if(uid <= 0){
+            log.warn("in computePublishPrd uid illegal , req {}", req);
+            throw new GatewayException(400, "用户ID错误");
+        }
         //
         Integer storageId = req.getStorageId();
         if (storageId <=0 ){
             log.warn("in computePublishPrd storageId illegal , req {}", req);
             throw new GatewayException(400, "storageId 错误");
         }
+        int num;
+        if ((num = req.getNum())<=0){
+            log.warn("in computePublishPrd num illegal , req {}", req);
+            throw new GatewayException(400, "非法数量值");
+        }
 
         /*商品鉴定费 ¥10.00
         商品包装费 ¥10.00
@@ -134,42 +139,15 @@ public class SellerOrderService  implements IOrderListService, IOrderDetailServi
             throw new GatewayException(400, "价格须为以9结尾的正整数");
         }
 
-
         BigDecimal prdPrice = null;
         try{
             prdPrice = new BigDecimal(price);
         }catch (Exception e){
             log.warn("in computePublishPrd price convert BigDecimal fail, {}", req);
-            return null;
-        }
-
-        checkPrice(storageId, prdPrice, false);
-
-
-        return buildSoldPrdComputeBo(prdPrice);
-    }
-
-
-    void checkPrice(int storageId, BigDecimal prdPrice, boolean validateMaxPrice) throws GatewayException {
-        ProductInfo productInfo = productProxyService.getPrdPriceRange(storageId);
-        BigDecimal minPrice = productInfo.getMinPrice();
-        BigDecimal maxPrice = productInfo.getMaxPrice();
-        if (prdPrice.subtract(minPrice).doubleValue() < 0D){
-            log.warn("in computePublishPrd,minPrice {}, storageId {}", minPrice, storageId);
-            throw new GatewayException(501, "您的出价过低");
-        }
-
-        if (validateMaxPrice && prdPrice.subtract(maxPrice).doubleValue() > 0D){
-            log.warn("in computePublishPrd,maxPrice {}, storageId {}", maxPrice, storageId);
-            throw new GatewayException(501, "您的出价过高");
-        }
-    }
-
-    void checkIncome(int storageId, BigDecimal income) throws GatewayException {
-        if (income == null || income.compareTo(BigDecimal.ZERO) <= 0){
-            log.warn("in checkIncome,storageId {}, income {}", income);
-            throw new GatewayException(501, "别闹了,这个售价没有收入");
+            throw new GatewayException(400, "非法数字");
         }
+        sellerOrderPrepareProcessor.checkPrice(storageId, prdPrice, false);
+        return buildSoldPrdComputeBo(uid, num, prdPrice);
     }
 
     /**
@@ -180,22 +158,22 @@ public class SellerOrderService  implements IOrderListService, IOrderDetailServi
      */
 
     public OrderSubmitResp publishPrd(SellerOrderSubmitReq req) throws GatewayException {
-        SellerOrderContext context = buildSellerOrderContext(req);
+        SellerOrderContext context = sellerOrderPrepareProcessor.buildSellerOrderContext(req);
         int storageId = context.getStorageId();
         int uid = context.getUid();
         //step 1: rpc get product detail by storage id
         //ufo.product.storage.data
-        GoodsInfo goodsInfo = getProductDetail(context);
+        GoodsInfo goodsInfo = sellerOrderPrepareProcessor.getProductDetail(context);
         //step 2: generate skup ,action :set price status(unsaleable)
         if (Objects.isNull(goodsInfo)){
-            log.warn("in computePublishPrd storageId not exist in prd , uid {}, storageId {}", uid, storageId);
+            log.warn("in publishPrd storageId not exist in prd service , uid {}, storageId {}", uid, storageId);
             throw new ServiceException(ServiceError.ORDER_ORDERS_GOODS_IS_EMPTY);
         }
         context.setSoldProduct(goodsInfo);
-        checkPrice(storageId, goodsInfo.getPrice(), true);
+        sellerOrderPrepareProcessor.checkPrice(storageId, goodsInfo.getPrice(), true);
         // compute every fee from price
         SellerOrderComputeResult computeResult = computeHandler.compute(goodsInfo.getPrice());
-        checkIncome(storageId, computeResult.getIncome());
+        sellerOrderPrepareProcessor.checkIncome(storageId, computeResult.getIncome());
         log.info("in publishPrd , uid {}, storageId {}, price {}, computeResult {}", uid, storageId,
                 goodsInfo.getPrice(), computeResult);
         context.setSellerOrderComputeResult(computeResult);
@@ -241,98 +219,6 @@ public class SellerOrderService  implements IOrderListService, IOrderDetailServi
     }
 
 
-
-    private GoodsInfo getProductDetail(SellerOrderContext context){
-        int uid = context.getUid();
-        int storageId = context.getStorageId();
-        BigDecimal salePrice = context.getSalePrice();
-        try {
-            StorageDataResp prdResp = productProxyService.getStorageData(storageId);
-
-            if (!Integer.valueOf(1).equals(prdResp.getStatus())) {
-                log.info("in getProductDetail occur product out shelve, uid {}, storageId {}", uid, storageId);
-                return null;
-            }
-
-            GoodsInfo goodsInfo = new GoodsInfo();
-            goodsInfo.setUid(uid);
-            goodsInfo.setProductId(prdResp.getProductId());
-            goodsInfo.setProductName(prdResp.getProductName());
-            goodsInfo.setColorId(Objects.isNull(prdResp.getColorId()) ? null : Integer.valueOf(prdResp.getColorId()));
-            goodsInfo.setColorName(prdResp.getColorName());
-            GoodsSize size;
-            if (Objects.nonNull(size =prdResp.getSize())){
-                goodsInfo.setSizeName(size.getSizeName());
-                goodsInfo.setSizeId(size.getSizeId());
-            }
-            goodsInfo.setImageUrl(prdResp.getImageUrl());
-            goodsInfo.setPrice(salePrice);
-            goodsInfo.setStorageId(context.getStorageId());
-            return goodsInfo;
-        }catch (Exception ex){
-            log.warn("in getProductDetail occur error, uid {}, storageId {}", uid, storageId);
-            return null;
-        }
-    }
-
-
-    private SellerOrderContext buildSellerOrderContext(SellerOrderSubmitReq req) throws GatewayException {
-        int uid = req.getUid();
-        if (uid <= 0){
-            log.warn("uid illegal , uid {}", uid);
-            throw new GatewayException(400, "Uid 错误");
-        }
-        Integer storageId = req.getStorageId();
-        if (storageId <=0 ){
-            log.warn("storageId illegal , uid {}", uid);
-            throw new GatewayException(400, "storageId 错误");
-        }
-        String price = req.getPrice();
-        if (StringUtils.isBlank(price)){
-            log.warn("in buildSellerOrderContext price illegal , req {}", req);
-            throw new GatewayException(400, "没有价格");
-        }
-
-        if(!price.endsWith("9")){
-            log.warn("in buildSellerOrderContext price illegal , req {}", req);
-            throw new GatewayException(400, "价格须为以9结尾的正整数");
-        }
-
-        BigDecimal salePrice;
-        try{
-            salePrice = new BigDecimal(req.getPrice());
-        }catch (Exception ex){
-            log.warn("storageId illegal , uid {}", uid);
-            throw new GatewayException(400, "售价格式错误");
-        }
-
-        int addressId = AddressUtil.getDecryptStr(req.getAddressId());
-        if (addressId < 0){
-            log.warn("seller submit order addressId invalidate, uid {}, storageId {}, addressId is {}",
-                    uid, storageId, req.getAddressId());
-            throw new ServiceException(ServiceError.ORDER_ADDRESSID_INVALIDATE);
-        }
-
-        //the address of send back 2 seller
-        //
-        AddressInfo hiddenBackAddress = userProxyService.getHiddenAddressInfo(uid, addressId);
-        AddressInfo noHiddenBackAddress = userProxyService.getAddressInfoNotHidden(uid, addressId);
-        if(AddressHelper.isNeedUpdate(noHiddenBackAddress)){
-            log.warn("seller submit addressId need update, uid is {}, storageId is {}, addressId is {}",
-                    uid, storageId, addressId);
-            throw new ServiceException(ServiceError.ORDER_ADDRESS_NEED_UPDATE);
-        }
-        //
-        SellerOrderContext context = new SellerOrderContext();
-        context.setUid(uid);
-        context.setStorageId(storageId);
-        context.setSalePrice(salePrice);
-        //
-        context.setBackAddress(noHiddenBackAddress);
-        context.setBackHiddenAddress(hiddenBackAddress);
-        return context;
-    }
-
     /**
      * 卖家支付完成后调用
      * @param uid
@@ -354,6 +240,21 @@ public class SellerOrderService  implements IOrderListService, IOrderDetailServi
 
     }
 
+    @Autowired
+    private SkupBatchService skupBatchService;
+
+    public void batchPublishPrds(SellerOrderSubmitReq req) throws GatewayException {
+        // 一串校验
+        SellerOrderContext ctx = sellerOrderPrepareProcessor.buildBatchSellerOrderContext(req);
+        //TODO 扣减保证金
+        //TODO (异步实现)记录保证金流水
+        //TODO 生成批次号
+        skupBatchService.generateBatchNo(req.getUid(), req.getNum());
+        //TODO 批量生成订单(订单表,meta 地址,算费)--> 需要用到多线程并行处理
+        //TODO(异步实现)同步数据到prd,记录支付,
+
+    }
+
 
     public boolean offShelveByErp(int skup){
         if (skup <= 0 ){
@@ -366,6 +267,11 @@ public class SellerOrderService  implements IOrderListService, IOrderDetailServi
         return true;
     }
 
+    public boolean batchCancel(SellerOrderBatchCancelReq req){
+
+
+        return true;
+    }
 
     public boolean cancel(SellerOrderCancelReq req){
         log.info("seller self cancel order,req {}", req);
@@ -435,16 +341,14 @@ public class SellerOrderService  implements IOrderListService, IOrderDetailServi
 
         if(OrderCodeType.BUYER_TYPE.getType() == codeMeta.getType()){
             BuyerOrder buyerOrder = buyerOrderMapper.selectAllByOrderCode(orderCode);
-            //todo 判断状态后更新
+            //判断状态后更新
             checkBuyCanDelStatus(buyerOrder.getStatus());
-
             BuyerOrder target = new BuyerOrder();
             target.setId(buyerOrder.getId());
             target.setSellerOrderStatus(DelStatus.IS_DEL.getCode());
             target.setUpdateTime(DateUtil.getCurrentTimeSecond());
             buyerOrderMapper.updateByPrimaryKeySelective(target);
         }
-
         cacheCleaner.cleanList(uid, TabType.SELL.getValue());
         return true;
     }
@@ -476,10 +380,12 @@ public class SellerOrderService  implements IOrderListService, IOrderDetailServi
     }
 
 
-
-
-    public SoldPrdComputeBo buildSoldPrdComputeBo(BigDecimal prdPrice){
+    private SoldPrdComputeBo buildSoldPrdComputeBo(int uid, int num, BigDecimal prdPrice){
         SellerOrderComputeResult computeResult = computeHandler.compute(prdPrice);
+        /**
+         * 验证是否是入驻商家
+         */
+        sellerOrderPrepareProcessor.checkNGetMergeEarnestMoney(uid, computeResult, num, prdPrice);
         SoldPrdComputeBo computeBo = SellerOrderConvertor.computeResult2SoldPrdComputeBo(computeResult);
         return computeBo;
     }
@@ -497,8 +403,6 @@ public class SellerOrderService  implements IOrderListService, IOrderDetailServi
         return sellerOrderDetailService.getOrderDetail(orderRequest);
     }
 
-
-
     /**
      * 根据用户id查询卖的单数
      * 出售栏目显示的数量=出售tab下商品“出售中”状态的数量+待发货tab下所有的订单数+已发货tab下所有订单数
@@ -547,4 +451,12 @@ public class SellerOrderService  implements IOrderListService, IOrderDetailServi
                 .actor(orderRequest.getTabType()).build();
     }
 
+
+    public BatchChangePriceResp batchChangePrice(BatchChangePriceReq req){
+        BatchChangePriceResp resp = BatchChangePriceResp.builder().successCnt(1).failCnt(1)
+                .tips("变价成功1个,失败1个").build();
+
+        return resp;
+    }
+
 }
diff --git a/order/src/main/java/com/yohoufo/order/service/impl/SkupBatchService.java b/order/src/main/java/com/yohoufo/order/service/impl/SkupBatchService.java
new file mode 100644
index 0000000..928b690
--- /dev/null
+++ b/order/src/main/java/com/yohoufo/order/service/impl/SkupBatchService.java
@@ -0,0 +1,28 @@
+package com.yohoufo.order.service.impl;
+
+import com.yohoufo.common.utils.DateUtil;
+import com.yohoufo.dal.order.SkupBatchMapper;
+import com.yohoufo.dal.order.model.SkupBatch;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * Created by chao.chen on 2018/11/19.
+ */
+@Service
+public class SkupBatchService {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+    private SkupBatchMapper skupBatchMapper;
+
+    public Long generateBatchNo(int uid, int num){
+        SkupBatch record = new SkupBatch();
+        record.setUid(uid);
+        record.setNum(num);
+        record.setCreateTime(DateUtil.getCurrentTimeSecond());
+        skupBatchMapper.insertSelective(record);
+        return record.getId();
+    }
+}
diff --git a/order/src/main/java/com/yohoufo/order/service/impl/SkupService.java b/order/src/main/java/com/yohoufo/order/service/impl/SkupService.java
index 4d39b0f..c7b72ae 100644
--- a/order/src/main/java/com/yohoufo/order/service/impl/SkupService.java
+++ b/order/src/main/java/com/yohoufo/order/service/impl/SkupService.java
@@ -1,7 +1,9 @@
 package com.yohoufo.order.service.impl;
 
 import com.yoho.core.dal.datasource.annotation.Database;
+import com.yohobuy.ufo.model.order.req.SellerOrderSubmitReq;
 import com.yohoufo.dal.order.SellerOrderGoodsMapper;
+import com.yohoufo.dal.order.SkupBatchMapper;
 import com.yohoufo.dal.order.model.SellerOrderGoods;
 import com.yohobuy.ufo.model.order.common.SkupStatus;
 import com.yohobuy.ufo.model.order.bo.GoodsInfo;
@@ -24,6 +26,9 @@ public class SkupService {
     @Autowired
     private SellerOrderGoodsMapper sellerOrderGoodsMapper;
 
+    @Autowired
+    private SkupBatchMapper skupBatchMapper;
+
     @Transactional(propagation = Propagation.REQUIRED)
     @Database(ForceMaster=true, DataSource="ufo_order")
     public SellerOrderGoods addSkup(GoodsInfo goodsInfo){
@@ -58,6 +63,10 @@ public class SkupService {
         return sellerOrderGoods;
     }
 
+    public void batchPublishPrds(SellerOrderSubmitReq req){
+
+
+    }
 
 
 }
diff --git a/order/src/main/java/com/yohoufo/order/service/impl/processor/SellerOrderPrepareProcessor.java b/order/src/main/java/com/yohoufo/order/service/impl/processor/SellerOrderPrepareProcessor.java
new file mode 100644
index 0000000..d810bf9
--- /dev/null
+++ b/order/src/main/java/com/yohoufo/order/service/impl/processor/SellerOrderPrepareProcessor.java
@@ -0,0 +1,226 @@
+package com.yohoufo.order.service.impl.processor;
+
+import com.yoho.error.ServiceError;
+import com.yoho.error.exception.ServiceException;
+import com.yohobuy.ufo.model.order.bo.GoodsInfo;
+import com.yohobuy.ufo.model.order.common.SellerWalletType;
+import com.yohobuy.ufo.model.order.req.SellerOrderSubmitReq;
+import com.yohoufo.common.exception.GatewayException;
+import com.yohoufo.common.utils.AddressUtil;
+import com.yohoufo.common.utils.BigDecimalHelper;
+import com.yohoufo.dal.order.SellerWalletMapper;
+import com.yohoufo.dal.order.model.SellerWallet;
+import com.yohoufo.order.model.AddressInfo;
+import com.yohoufo.order.model.SellerOrderContext;
+import com.yohoufo.order.model.dto.SellerOrderComputeResult;
+import com.yohoufo.order.service.handler.SellerOrderComputeHandler;
+import com.yohoufo.order.service.proxy.ProductProxyService;
+import com.yohoufo.order.service.proxy.UserProxyService;
+import com.yohoufo.order.utils.AddressHelper;
+import com.yohoufo.product.model.GoodsSize;
+import com.yohoufo.product.model.ProductInfo;
+import com.yohoufo.product.response.StorageDataResp;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Objects;
+
+/**
+ * Created by chao.chen on 2018/11/19.
+ */
+@Service
+public class SellerOrderPrepareProcessor {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private UserProxyService userProxyService;
+
+    @Autowired
+    private ProductProxyService productProxyService;
+
+    @Autowired
+    private SellerOrderComputeHandler computeHandler;
+
+    @Autowired
+    private SellerWalletMapper sellerWalletMapper;
+
+    public SellerOrderContext buildBatchSellerOrderContext(SellerOrderSubmitReq req) throws GatewayException {
+        SellerOrderContext ctx = buildSellerOrderContext(req);
+        int storageId = ctx.getStorageId();
+        int uid = ctx.getUid();
+        int storageNum = req.getNum();
+        if (storageNum <=0){
+            log.warn("in buildBatchSellerOrderContext storageNum illegal , uid {}, storageId {} storageNum {}",
+                    uid, storageId, storageNum);
+            throw new ServiceException(ServiceError.ORDER_ORDERS_GOODS_IS_EMPTY);
+        }
+        //step 1: rpc get product detail by storage id
+        //ufo.product.storage.data
+        GoodsInfo goodsInfo = getProductDetail(ctx);
+        //step 2: generate skup ,action :set price status(unsaleable)
+        if (Objects.isNull(goodsInfo)){
+            log.warn("in buildBatchSellerOrderContext storageId not exist in prd , uid {}, storageId {}", uid, storageId);
+            throw new ServiceException(ServiceError.ORDER_ORDERS_GOODS_IS_EMPTY);
+        }
+
+        goodsInfo.setStorageNum(storageNum);
+        ctx.setSoldProduct(goodsInfo);
+        checkPrice(storageId, goodsInfo.getPrice(), true);
+        // compute every fee from price
+        SellerOrderComputeResult computeResult = computeHandler.compute(goodsInfo.getPrice());
+        checkIncome(storageId, computeResult.getIncome());
+        checkNGetMergeEarnestMoney(uid, computeResult, storageNum, goodsInfo.getPrice());
+        return ctx;
+    }
+
+
+    public SellerOrderContext buildSellerOrderContext(SellerOrderSubmitReq req) throws GatewayException {
+        int uid = req.getUid();
+        if (uid <= 0){
+            log.warn("uid illegal , uid {}", uid);
+            throw new GatewayException(400, "Uid 错误");
+        }
+        Integer storageId = req.getStorageId();
+        if (storageId <=0 ){
+            log.warn("storageId illegal , uid {}", uid);
+            throw new GatewayException(400, "storageId 错误");
+        }
+        String price = req.getPrice();
+        if (StringUtils.isBlank(price)){
+            log.warn("in buildSellerOrderContext price illegal , req {}", req);
+            throw new GatewayException(400, "没有价格");
+        }
+
+        if(!price.endsWith("9")){
+            log.warn("in buildSellerOrderContext price illegal , req {}", req);
+            throw new GatewayException(400, "价格须为以9结尾的正整数");
+        }
+
+        BigDecimal salePrice;
+        try{
+            salePrice = new BigDecimal(req.getPrice());
+        }catch (Exception ex){
+            log.warn("storageId illegal , uid {}", uid);
+            throw new GatewayException(400, "售价格式错误");
+        }
+
+        int addressId = AddressUtil.getDecryptStr(req.getAddressId());
+        if (addressId < 0){
+            log.warn("seller submit order addressId invalidate, uid {}, storageId {}, addressId is {}",
+                    uid, storageId, req.getAddressId());
+            throw new ServiceException(ServiceError.ORDER_ADDRESSID_INVALIDATE);
+        }
+
+        //the address of send back 2 seller
+        //
+        AddressInfo hiddenBackAddress = userProxyService.getHiddenAddressInfo(uid, addressId);
+        AddressInfo noHiddenBackAddress = userProxyService.getAddressInfoNotHidden(uid, addressId);
+        if(AddressHelper.isNeedUpdate(noHiddenBackAddress)){
+            log.warn("seller submit addressId need update, uid is {}, storageId is {}, addressId is {}",
+                    uid, storageId, addressId);
+            throw new ServiceException(ServiceError.ORDER_ADDRESS_NEED_UPDATE);
+        }
+        //
+        SellerOrderContext context = new SellerOrderContext();
+        context.setUid(uid);
+        context.setStorageId(storageId);
+        context.setSalePrice(salePrice);
+        //
+        context.setBackAddress(noHiddenBackAddress);
+        context.setBackHiddenAddress(hiddenBackAddress);
+        return context;
+    }
+
+    public GoodsInfo getProductDetail(SellerOrderContext context){
+        int uid = context.getUid();
+        int storageId = context.getStorageId();
+        BigDecimal salePrice = context.getSalePrice();
+        try {
+            StorageDataResp prdResp = productProxyService.getStorageData(storageId);
+            if (!Integer.valueOf(1).equals(prdResp.getStatus())) {
+                log.info("in getProductDetail occur product out shelve, uid {}, storageId {}", uid, storageId);
+                return null;
+            }
+            GoodsInfo goodsInfo = new GoodsInfo();
+            goodsInfo.setUid(uid);
+            goodsInfo.setProductId(prdResp.getProductId());
+            goodsInfo.setProductName(prdResp.getProductName());
+            goodsInfo.setColorId(Objects.isNull(prdResp.getColorId()) ? null : Integer.valueOf(prdResp.getColorId()));
+            goodsInfo.setColorName(prdResp.getColorName());
+            GoodsSize size;
+            if (Objects.nonNull(size = prdResp.getSize())){
+                goodsInfo.setSizeName(size.getSizeName());
+                goodsInfo.setSizeId(size.getSizeId());
+            }
+            goodsInfo.setImageUrl(prdResp.getImageUrl());
+            goodsInfo.setPrice(salePrice);
+            goodsInfo.setStorageId(context.getStorageId());
+            return goodsInfo;
+        }catch (Exception ex){
+            log.warn("in getProductDetail occur error, uid {}, storageId {}", uid, storageId);
+            return null;
+        }
+    }
+
+    public void checkPrice(int storageId, BigDecimal prdPrice, boolean validateMaxPrice) throws GatewayException {
+        ProductInfo productInfo = productProxyService.getPrdPriceRange(storageId);
+        BigDecimal minPrice = productInfo.getMinPrice();
+        BigDecimal maxPrice = productInfo.getMaxPrice();
+        if (prdPrice.subtract(minPrice).doubleValue() < 0D){
+            log.warn("in computePublishPrd,minPrice {}, storageId {}", minPrice, storageId);
+            throw new GatewayException(501, "您的出价过低");
+        }
+
+        if (validateMaxPrice && prdPrice.subtract(maxPrice).doubleValue() > 0D){
+            log.warn("in computePublishPrd,maxPrice {}, storageId {}", maxPrice, storageId);
+            throw new GatewayException(501, "您的出价过高");
+        }
+    }
+
+    public void checkIncome(int storageId, BigDecimal income) throws GatewayException {
+        if (income == null || income.compareTo(BigDecimal.ZERO) <= 0){
+            log.warn("in checkIncome,storageId {}, income {}", storageId, income);
+            throw new GatewayException(501, "别闹了,这个售价没有收入");
+        }
+    }
+
+    public BigDecimal checkNGetMergeEarnestMoney(int uid, SellerOrderComputeResult computeResult, int num, BigDecimal prdPrice){
+        boolean isEntryShop = userProxyService.isEntryShop(uid);
+        BigDecimal mEarestMoney = null;
+        if(isEntryShop){
+            BigDecimal singleEarestMoney = computeResult.getEarnestMoney().getEarnestMoney();
+            mEarestMoney = BigDecimalHelper.halfUp(new BigDecimal(num).multiply(singleEarestMoney));
+            boolean isEnough = isEnough(uid, mEarestMoney);
+            if (!isEnough){
+                log.warn("in buildSoldPrdComputeBo,wallet is not enough,uid {} num {} prdPrice {} singleEarestMoney {}",
+                        uid, num, prdPrice, singleEarestMoney);
+                throw new ServiceException(ServiceError.WALLET_EARNESTMONEY_IS_NOT_ENOUGH);
+            }
+        }
+        return mEarestMoney;
+    }
+
+    /**
+     *
+     * @param uid
+     * @param mEarestMoney
+     * @return
+     */
+    private boolean isEnough(int uid, BigDecimal mEarestMoney){
+        //取出入驻商家的钱包余额,判断保证金总额是否足够扣减
+        SellerWallet condition = new SellerWallet();
+        condition.setUid(uid);
+        condition.setType(SellerWalletType.EARNEAST_MONEY.getCode());
+        SellerWallet psw = sellerWalletMapper.selectByUidNType(condition);
+        log.info("in compare price, uid {}, mEarestMoney {}, SellerWallet {}", uid, mEarestMoney, psw);
+        if (psw !=null && psw.getAmount().compareTo(mEarestMoney) >= 0){
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/order/src/main/java/com/yohoufo/order/service/proxy/SmsContentEnum.java b/order/src/main/java/com/yohoufo/order/service/proxy/SmsContentEnum.java
index 7ad2c6e..e102c31 100644
--- a/order/src/main/java/com/yohoufo/order/service/proxy/SmsContentEnum.java
+++ b/order/src/main/java/com/yohoufo/order/service/proxy/SmsContentEnum.java
@@ -14,6 +14,11 @@ public enum SmsContentEnum {
     SMS_NOTIFIED_SEND_FAILED("您的商品{}未在规定时间内发货,平台已将您的保证金扣除并赔偿给买家。更多信息请查看Yoho!Buy有货APP [UFO飞碟好物-我的-出售]。"),
     SMS_CLOSED_BUYER("买家已取消订单,您的商品{}已重新上架出售。更多信息请查看Yoho!Buy有货APP [UFO飞碟好物-我的-出售]。"),
     SMS_NOTIFIED_UNSHELF("因为特殊原因,您的商品{}暂停售卖,您支付的保证金将于1个工作日内退回您的支付账户。"),
+
+    //给卖家发通知 ,当买家取消订单(付款后取消,卖家发货后取消,卖家商品已经被平台签收)
+    SMS_CANCELED_BY_BUYER_AFTER_PAID("买家已取消订单,您的商品「商品名称」已下架,更多信息请查看Yoho!Buy有货APP [UFO飞碟好物-我的-出售]。"),
+    SMS_CANCELED_BY_BUYER_AFTER_DELIVERY("买家已取消订单,请自行召回货品,如有其他疑问,请联系Yoho!Buy有货APP人工客服。"),
+    SMS_CANCELED_BY_BUYER_AFTER_RECEIVED("您的商品已顺丰到付退回,快递单号{},请注意查收。"),
     ;
 
     private String content;
diff --git a/order/src/main/java/com/yohoufo/order/service/proxy/UserProxyService.java b/order/src/main/java/com/yohoufo/order/service/proxy/UserProxyService.java
index ef7de42..1392630 100644
--- a/order/src/main/java/com/yohoufo/order/service/proxy/UserProxyService.java
+++ b/order/src/main/java/com/yohoufo/order/service/proxy/UserProxyService.java
@@ -8,6 +8,7 @@ import com.yoho.error.ServiceError;
 import com.yoho.error.exception.ServiceException;
 import com.yoho.service.model.request.UserAddressReqBO;
 import com.yohoufo.common.ApiResponse;
+import com.yohoufo.common.caller.UfoServiceCaller;
 import com.yohoufo.order.convert.AddressInfoConvertor;
 import com.yohoufo.order.model.AddressInfo;
 import org.apache.commons.lang3.StringUtils;
@@ -38,6 +39,9 @@ public class UserProxyService {
 
     @Value("${uic.url:http://uic.yohoops.org/uic}")
     private String uicUrl;
+
+    @Autowired
+    private UfoServiceCaller ufoServiceCaller;
     /**
      * 获取用户信息
      * @param uid
@@ -133,4 +137,18 @@ public class UserProxyService {
         }
         return mobile;
     }
+
+    public boolean isEntryShop(int uid){
+
+        //入驻商户 method=ufo.user.isStoredSeller   ,入参  uid
+        ApiResponse userInfo ;
+        try {
+            userInfo = ufoServiceCaller.call("ufo.user.isStoredSeller", uid);
+        }catch (Exception ex){
+            logger.warn("in getMobile fail, uid {}", uid,  ex);
+            throw new ServiceException(ServiceError.USER_IS_NOT_EXIST);
+        }
+        logger.info("judge user is entry shop, uid {} resp {}", uid, userInfo);
+        return  (userInfo == null || userInfo.getData() == null) ? false : (boolean) userInfo.getData();
+    }
 }
diff --git a/order/src/main/java/com/yohoufo/order/service/support/codegenerator/bean/CodeBitMeta.java b/order/src/main/java/com/yohoufo/order/service/support/codegenerator/bean/CodeBitMeta.java
index 72d3160..5954280 100755
--- a/order/src/main/java/com/yohoufo/order/service/support/codegenerator/bean/CodeBitMeta.java
+++ b/order/src/main/java/com/yohoufo/order/service/support/codegenerator/bean/CodeBitMeta.java
@@ -4,12 +4,14 @@ package com.yohoufo.order.service.support.codegenerator.bean;
 import lombok.Data;
 
 /**
+ * <pre>
  * 生成订单号bit元数据
  * 订单号:
- * 1位: 类型(标识是卖家订单号or买家订单号)
+ * 2位: 类型(标识是卖家订单号or买家订单号) 
  * 30位: 时间戳(秒级时间) 2的30次方/60/6024/365=34,也就是说可以用30年
  * 10位: 序列号, 也就是说 每秒支持1K多的id
  * 3位: 服务节点,支持8个服务节点
+ * </pre>
  */
 @Data
 public class CodeBitMeta {
@@ -17,7 +19,7 @@ public class CodeBitMeta {
     /**
      * 类型
      */
-    private byte typeBits = 1;
+    private byte typeBits = 2;
 
 
     /**
@@ -35,7 +37,7 @@ public class CodeBitMeta {
      */
     private byte machineBits = 3;
 
-
+    // 最右边长度为machineBits位为1,其他为0
     public long getMachineBitsMask() {
         return -1L ^ -1L << machineBits;
     }
diff --git a/order/src/main/java/com/yohoufo/order/service/support/codegenerator/populater/PropMachineIdProvider.java b/order/src/main/java/com/yohoufo/order/service/support/codegenerator/populater/PropMachineIdProvider.java
index d507cb1..2f25b48 100644
--- a/order/src/main/java/com/yohoufo/order/service/support/codegenerator/populater/PropMachineIdProvider.java
+++ b/order/src/main/java/com/yohoufo/order/service/support/codegenerator/populater/PropMachineIdProvider.java
@@ -1,53 +1,103 @@
 package com.yohoufo.order.service.support.codegenerator.populater;
 
+import com.yohoufo.common.utils.DateUtil;
 import com.yohoufo.common.utils.IpUtils;
-import org.apache.commons.lang3.StringUtils;
+import com.yohoufo.dal.order.MachineIdGenerateMapper;
+import com.yohoufo.dal.order.model.MachineIdGenerate;
+import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-
 import javax.annotation.PostConstruct;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.List;
+import java.util.stream.Collectors;
 
 @Component
 public class PropMachineIdProvider implements MachineIdProvider {
 
     protected final Logger log = LoggerFactory.getLogger(this.getClass());
 
-    private Map<String, Long> ipsMap = new HashMap<String, Long>();
 
+    @Autowired
+    MachineIdGenerateMapper machineIdGenerateMapper;
 
-    @Value("${ips.machine}")
-    private String machineIps;
+    /**
+     * 默认的机器Id
+     * @return
+     */
+    private long machineId = 0l;
 
     @Override
     public long getMachineId() {
 
+        return machineId;
+    }
+
+
+    @PostConstruct
+    public void init(){
+
         String ip = IpUtils.getHostIp();
+        MachineIdGenerate machineIdGenerate = machineIdGenerateMapper.selectByIp(IpUtils.getHostIp());
+        if (machineIdGenerate != null){
+            machineId = machineIdGenerate.getMachineId();
+            log.info("machineId is {}", machineId);
+            return;
+        }
 
-        log.info("ip:{}, machineIps is {}",ip, machineIps);
-        Long machineId = ipsMap.get(ip);
+        // 初次启动,插入该ip的一条记录
+        Integer usableMachineId = getUsableMachineId();
+        int row = insertMachineId(usableMachineId, ip);
 
-        if (machineId == null){
-            return 0l;
+        if (row > 0){
+            machineId = usableMachineId.intValue();
+            log.info("machineId is {}", machineId);
+            return;
         }
 
-        return machineId.longValue();
+        // 插入失败,重复的machineId, ==> 重试一次
+        usableMachineId = getUsableMachineId();
+        row = insertMachineId(usableMachineId, ip);
+        if (row > 0){
+            machineId = usableMachineId.intValue();
+            log.info("machineId is {}", machineId);
+            return;
+        }
+
+        throw new IllegalStateException("insert into ufo_order.machine_id_generate fail");
+
     }
 
+    private int insertMachineId(Integer usableMachineId, String ip) {
 
-    @PostConstruct
-    public void init(){
-        if (StringUtils.isEmpty(machineIps)) {
-            return;
+        MachineIdGenerate db = new MachineIdGenerate();
+        db.setIp(ip);
+        db.setMachineId(usableMachineId.intValue());
+        db.setCreateTime(DateUtil.getCurrentTimeSecond());
+        return machineIdGenerateMapper.insert(db);
+    }
+
+    private Integer getUsableMachineId() {
+        List<MachineIdGenerate> machines = machineIdGenerateMapper.selectByAll();
+        if (CollectionUtils.isEmpty(machines)){
+            return 0;
         }
 
-        String[] ips = machineIps.split(",");
+        List<Integer> machineIds = machines.stream().map(MachineIdGenerate::getMachineId).collect(Collectors.toList());
+
+        Integer usableMachineId = null;
+        for (int i=0; i<7; i++){
+            if (!machineIds.contains(Integer.valueOf(i))){
+                usableMachineId = Integer.valueOf(i);
+                break;
+            }
+        }
 
-        for (int i=0; i < ips.length; i++){
-            ipsMap.put(ips[i], (long)i);
+        // 无可用的machineid,联系管理员删除db数据
+        if (usableMachineId == null){
+            throw new IllegalStateException("check ufo_order.machine_id_generate machine 0-7 full.");
         }
+        return usableMachineId;
     }
 }
diff --git a/order/src/test/java/com/yohoufo/order/service/TestZKLock.java b/order/src/test/java/com/yohoufo/order/service/TestZKLock.java
new file mode 100644
index 0000000..a7d3f2d
--- /dev/null
+++ b/order/src/test/java/com/yohoufo/order/service/TestZKLock.java
@@ -0,0 +1,91 @@
+package com.yohoufo.order.service;
+
+import com.yohoufo.common.utils.IpUtils;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.recipes.locks.InterProcessMultiLock;
+import org.apache.curator.retry.ExponentialBackoffRetry;
+import org.apache.zookeeper.CreateMode;
+import sun.net.util.IPAddressUtil;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class TestZKLock {
+
+
+    public static void main(String[] args) throws Exception{
+
+        String connectionStr = "192.168.102.45";
+
+        String lock_path = "/ufo/code_lock";
+
+        String path = "/ufo/machine/id";
+
+        CuratorFramework client = CuratorFrameworkFactory.builder()
+                .connectString(connectionStr)
+                .retryPolicy(new ExponentialBackoffRetry(1000, 3))
+                .sessionTimeoutMs(5000)
+                .connectionTimeoutMs(1000).build();
+
+
+        client.start();
+
+        InterProcessMultiLock lock = new InterProcessMultiLock(client, Arrays.asList(lock_path));
+
+        for (int i =0 ;i < 30; i++){
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+
+                    try{
+                        lock.acquire();
+
+                        // 指定节点下面的 子节点
+                        List<String> ids = client.getChildren().forPath(path);
+                        if (CollectionUtils.isEmpty(ids)){
+                            // 生成第一个节点
+                            client.create().withMode(CreateMode.EPHEMERAL).forPath(path +"/0");
+                        }else{
+                            // 方案①
+                            // 看看临时节点中哪个有空缺,则采用,
+                            // 就会出现新的问题,zk上临时节点是空缺的,但是服务采用了那个空缺的id,所以必须监听重连
+                            // 重连的时候,必须重新创建节点,更新服务使用的id
+                            // 只需要 监听该节点被删除的时候,需要重新创建新的临时节点,更新machineId
+                            // 一遍在获取,一遍在更新临时节点,非原子性,如果获取到的是旧的值,则有可能导致code重复
+
+                            // 初始化的时候,给自己的ip 建立一个节点 自增,持久
+
+
+
+                            // 方案②
+                            // 直接采用ip==>数字
+                            // 临时节点的话,没有必要记录ip,反正重发就已经删除了,也不会有根据ip获取id的情况
+                            // 持久节点的话,要考虑什么事情清理
+                            client.create().withMode(CreateMode.EPHEMERAL).forPath(path + "/" + IpUtils.getHostIp());
+                        }
+
+
+                    }catch (Exception e){
+
+                    }finally {
+                        try{
+                            lock.release();
+                        }catch (Exception e){
+
+                        }
+                    }
+                }
+            }).start();
+        }
+
+
+
+        Thread.sleep(Integer.MAX_VALUE);
+
+
+
+    }
+}
diff --git a/order/src/test/java/com/yohoufo/order/service/ZkTest.java b/order/src/test/java/com/yohoufo/order/service/ZkTest.java
new file mode 100644
index 0000000..7ad5707
--- /dev/null
+++ b/order/src/test/java/com/yohoufo/order/service/ZkTest.java
@@ -0,0 +1,136 @@
+package com.yohoufo.order.service;
+
+import org.apache.curator.RetryPolicy;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.api.BackgroundCallback;
+import org.apache.curator.framework.api.CuratorEvent;
+import org.apache.curator.framework.recipes.cache.*;
+import org.apache.curator.framework.state.ConnectionState;
+import org.apache.curator.framework.state.ConnectionStateListener;
+import org.apache.curator.retry.ExponentialBackoffRetry;
+import org.apache.zookeeper.CreateMode;
+
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+public class ZkTest {
+
+
+    public static void main(String[] args) throws Exception{
+
+        String rootPath = "/ufo/machine";
+        String path = rootPath + "/id";
+
+        String zookeeperConnectionString = "192.168.102.45";
+
+
+        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
+        CuratorFramework client = CuratorFrameworkFactory.builder()
+                .connectString(zookeeperConnectionString)
+                .sessionTimeoutMs(500)
+                .connectionTimeoutMs(5000)
+                .retryPolicy(retryPolicy)
+                .build();
+
+        client.start();
+
+        // 失败重连 监听
+        client.getConnectionStateListenable().addListener(new ConnectionStateListener() {
+
+            @Override
+            public void stateChanged(CuratorFramework client, ConnectionState newState) {
+
+                System.out.println("当前客户端的连接状态: " +newState);
+            }
+        });
+
+
+
+        // 子节点监听
+//        PathChildrenCache cache = new PathChildrenCache(client, rootPath, true);
+//        cache.start();
+//        cache.getListenable().addListener(new PathChildrenCacheListener() {
+//            @Override
+//            public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
+//                System.out.println("事情类型" + event.getType());
+//                if (event.getData() != null){
+//                    System.out.println("节点数据"+ event.getData().getPath() + " = " + new String(event.getData().getData()));
+//                }
+//            }
+//        });
+
+        String str = client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath(path);
+        System.out.println(str);
+
+
+        // 异步回调事件
+        String str2 = client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).inBackground(new BackgroundCallback() {
+            @Override
+            public void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {
+                System.out.println(curatorEvent.getResultCode() + "; " + curatorEvent.getType());
+            }
+        }).forPath(path);
+        System.out.println(str2);
+
+        // 现在的sessionId 0x1650ce0cd5a2482
+
+
+        // str.replace(path, "").replaceFirst("^0*","")
+
+        // 临时顺序节点,取模,一直自增,❌必然会出现 某几台机器的ip的顺序节点对8取模,结果是一样的,那么订单就有问题。
+
+        // or 把本机ip/序号 持久节点 固定ip获取到的机器保持一样的
+
+        // ①
+        // session超时,重连的时候,临时节点会重新创建吗
+        // curator不需要像clientZK一样,监听器,连接成功后,才往下处理 ❓❓❓
+        // 回答: 断开网络,通过链接的监听器,发现确实会自动重连,重连后能接受到子节点删除的事件,但是临时节点不会自动重新创建
+
+        // ②
+        // 当网络闪断重连的时候,sessionid发生改变,也就是说之前的session被清理了,临时节点也被清理了,问,临时节点上的watcher会不会被清理,客户端还能收到通知结果吗
+        // 实验证明不会 0x1650ce0cd5a24aa
+
+        // ③
+        // 如何模拟  SESSION_EXPIRE  的状态
+        //
+
+
+
+        List<String> ids = client.getChildren().forPath(rootPath);
+
+        for (String id : ids){
+            System.out.println("子节点路径=" + id + "; 子节点的数据=" + new String(client.getData().forPath(rootPath + "/" +  id)));
+
+
+            NodeCache cache2 = new NodeCache(client, rootPath + "/" +  id);
+            cache2.getListenable().addListener(new NodeCacheListener() {
+                @Override
+                public void nodeChanged() throws Exception {
+                    ChildData data = cache2.getCurrentData();
+
+                    if (null != data) {
+                        System.out.println("节点数据:" + new String(cache2.getCurrentData().getData()));
+                    } else {
+                        System.out.println( "节点被删除!");
+                    }
+                }
+            });
+            cache2.start();
+        }
+
+        // 当前的 sessionid 0x1650ce0cd5a2494
+
+
+
+
+
+
+
+        Thread.sleep(Integer.MAX_VALUE);
+
+    }
+
+
+}
diff --git a/pom.xml b/pom.xml
index 4dafed9..7b52616 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>com.yoho</groupId>
         <artifactId>parent</artifactId>
-        <version>1.4.7-SNAPSHOT</version>
+        <version>1.4.8-SNAPSHOT</version>
     </parent>
 
     <groupId>com.yohoufo.fore</groupId>
diff --git a/product/src/main/java/com/yohoufo/product/controller/ProductController.java b/product/src/main/java/com/yohoufo/product/controller/ProductController.java
index bc1c292..6fd9d3c 100644
--- a/product/src/main/java/com/yohoufo/product/controller/ProductController.java
+++ b/product/src/main/java/com/yohoufo/product/controller/ProductController.java
@@ -1,8 +1,11 @@
 package com.yohoufo.product.controller;
 
+import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
 
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -171,6 +174,24 @@ public class ProductController {
 		}
 	}
 	
+	/**
+	 * 批量创建skup
+	 * @param skupBo
+	 * @return
+	 */
+	@RequestMapping(params = "method=ufo.product.batchCreateSkup")
+	public ApiResponse batchCreateSkup(@RequestBody List<StoragePriceBo> skupBoList) {
+		LOG.info("in method=ufo.product.batchCreateSkup skupBoList = {}", skupBoList);
+		try {
+			productService.batchCreateSkup(skupBoList);
+			return new ApiResponse(200, "创建成功!", Boolean.TRUE);
+		} catch (Exception e) {
+			LOG.error("创建SKUP失败!", e);
+			int code = (e instanceof ServiceException) ? ((ServiceException) e).getCode() : 500;
+			return new ApiResponse(code, e.getMessage(), Boolean.FALSE);
+		}
+	}
+	
 	// 卖家修改状态:*1:可售(支付保证金),2:取消支付保证金,3:超时未支付保证金,4:支付保证金后取消售卖
 	@RequestMapping(params = "method=ufo.product.sellerUpdateStatus")
 	public ApiResponse sellerUpdateStatus(@RequestBody StoragePriceBo skupBo) {
@@ -189,6 +210,34 @@ public class ProductController {
 		}
 	}
 	
+	// 商家修改状态:1:上架 2:下架
+	@RequestMapping(params = "method=ufo.product.sellerBatchUpdateStatus")
+	public ApiResponse sellerBatchUpdateStatus(@RequestParam(value = "skupList", required = true) List<Integer> skupList,
+			                                   @RequestParam(value = "status", required = true) Integer status){
+		LOG.info("in method=ufo.product.sellerBatchUpdateStatus skupList is {}, status is {}", skupList, status);
+		int dbStatus = 1;//上架
+		if(1 != status.intValue() && 2 != status.intValue()) {
+			throw new ServiceException(400, "status值不对,只能传1或2!");
+		}
+		//下架
+		if(2 == status.intValue()) {
+			dbStatus = 104;
+		}
+		
+		try {
+			productService.sellerBatchUpdateStatus(skupList, dbStatus);
+			//清缓存
+			LOG.info("sellerUpdateStatus success and async clearProductCache skupList = {}", skupList);
+			clearBatchProductCache(skupList);
+			
+			return new ApiResponse(200, "更新成功!", Boolean.TRUE);
+		} catch (Exception e) {
+			LOG.error("sellerBatchUpdateStatus失败!", e);
+			int code = (e instanceof ServiceException) ? ((ServiceException) e).getCode() : 500;
+			return new ApiResponse(code, e.getMessage(), Boolean.FALSE);
+		}
+	}
+	
 	// 设置鉴定中心
 	@RequestMapping(params = "method=ufo.product.setDepotNum")
 	public ApiResponse setDepotNum(
@@ -257,4 +306,35 @@ public class ProductController {
 			}
 		});
 	}
+	
+	private void clearBatchProductCache(List<Integer> skupList) {
+		executors.execute(() -> {
+			try {
+				LOG.info("in clearBatchProductCache skupList = {}", skupList);
+				List<StoragePrice> spList = productService.getStoragePriceBySkupList(skupList);
+				List<Integer> productIdList = spList.stream().map(StoragePrice::getProductId).collect(Collectors.toList());
+				List<Integer> storageIdList = spList.stream().map(StoragePrice::getStorageId).collect(Collectors.toList());
+				if(CollectionUtils.isNotEmpty(productIdList)) {
+					for(Integer productId : productIdList) {
+						LOG.info("clearCache queryProductDetailById productId = {}, ", productId);
+						//商品详情
+						cacheAop.clearCache(
+								ProductController.class.getMethod("queryProductDetailById", new Class[] { Integer.class }),
+								new Object[] { productId });
+					}
+				}
+				if(CollectionUtils.isNotEmpty(storageIdList)) {
+					for(Integer storageId : storageIdList) {
+						// sku最低价
+						LOG.info("clearCache queryStorageLeastprice storageId = {}, ", storageId);
+						cacheAop.clearCache(
+								ProductController.class.getMethod("queryStorageLeastprice", new Class[] { Integer.class }),
+								new Object[] { storageId });
+					}
+				}
+			} catch (Exception e) {
+				LOG.error("删除商品缓存失败!", e);
+			}
+		});
+	}
 }
\ No newline at end of file
diff --git a/product/src/main/java/com/yohoufo/product/service/ProductService.java b/product/src/main/java/com/yohoufo/product/service/ProductService.java
index 60add60..c8bef5f 100644
--- a/product/src/main/java/com/yohoufo/product/service/ProductService.java
+++ b/product/src/main/java/com/yohoufo/product/service/ProductService.java
@@ -1,10 +1,15 @@
 package com.yohoufo.product.service;
 
-import com.yoho.core.dal.datasource.annotation.Database;
+import java.util.List;
+
 import com.yohoufo.dal.product.model.StoragePrice;
 import com.yohoufo.product.request.StoragePriceBo;
-import com.yohoufo.product.response.*;
-import org.springframework.transaction.annotation.Transactional;
+import com.yohoufo.product.response.ProductDetailResp;
+import com.yohoufo.product.response.ProductSeriesTemplateResp;
+import com.yohoufo.product.response.ProductSimpleResp;
+import com.yohoufo.product.response.ProductSortTemplateResp;
+import com.yohoufo.product.response.StorageDataResp;
+import com.yohoufo.product.response.StorageLeastPriceResp;
 
 public interface ProductService {
 
@@ -34,4 +39,15 @@ public interface ProductService {
 
 	// 查询商品的基本信息
 	ProductDetailResp queryProductBaseInfo(Integer productId);
+	
+	void batchCreateSkup(List<StoragePriceBo> skupBoList);
+	
+	/**
+	 * 卖家上架或下架商品
+	 * @param skupList
+	 * @param status
+	 */
+	void sellerBatchUpdateStatus(List<Integer> skupList, int status);
+	
+	List<StoragePrice> getStoragePriceBySkupList(List<Integer> skupList);
 }
diff --git a/product/src/main/java/com/yohoufo/product/service/impl/ProductServiceImpl.java b/product/src/main/java/com/yohoufo/product/service/impl/ProductServiceImpl.java
index aa5f955..33a12da 100644
--- a/product/src/main/java/com/yohoufo/product/service/impl/ProductServiceImpl.java
+++ b/product/src/main/java/com/yohoufo/product/service/impl/ProductServiceImpl.java
@@ -6,20 +6,20 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.function.BinaryOperator;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
-import com.yoho.core.dal.datasource.annotation.Database;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import com.google.common.collect.Lists;
 import com.yoho.core.common.helpers.ImagesHelper;
 import com.yoho.error.exception.ServiceException;
 import com.yohoufo.common.utils.DateUtil;
@@ -169,6 +169,11 @@ public class ProductServiceImpl implements ProductService{
 	public StoragePrice getStoragePriceBySkup(Integer skup) {
 		return storagePriceMapper.selectBySkup(skup);
 	}
+    
+    @Override
+	public List<StoragePrice> getStoragePriceBySkupList(List<Integer> skupList) {
+		return storagePriceMapper.selectBySkupList(skupList);
+	}
 
 	@Override
 	public ProductSortTemplateResp querySortTemplateData(String productIds) {
@@ -235,6 +240,22 @@ public class ProductServiceImpl implements ProductService{
 	}
 	
 	@Override
+	public void batchCreateSkup(List<StoragePriceBo> skupBoList) {
+		if(CollectionUtils.isEmpty(skupBoList)) {
+			throw new ServiceException(400, "skupBoList为空!");
+		}
+		
+		List<StoragePrice> spList = Lists.newArrayList();
+		//校验
+		for(int i=0; i<skupBoList.size(); i++) {
+			StoragePrice sp = exchangeCreateSkupBo(skupBoList.get(i));
+			spList.add(sp);
+		}
+		//批量插入数据库
+		storagePriceMapper.insertBatch(spList);
+	}
+	
+	@Override
 	public void sellerUpdateStatus(StoragePriceBo skupBo) {
 		// 卖家修改状态:*1:可售(支付保证金),2:取消支付保证金,3:超时未支付保证金,4:支付保证金后取消售卖
 		if (skupBo == null) {
@@ -280,6 +301,37 @@ public class ProductServiceImpl implements ProductService{
 	}
 	
 	@Override
+	public void sellerBatchUpdateStatus(List<Integer> skupList, int status) {
+		LOGGER.info("sellerBatchUpdateStatus in, skupList is {}, status is {}", skupList, status);
+		// 卖家修改上下架状态:*1:可售(支付保证金),商家上架,104:商家下架
+
+		int updateNum = storagePriceMapper.batchUpdateStatus(skupList, status);
+		if(updateNum == 0) {
+			throw new ServiceException(400, "更新上架状态失败!");
+		}
+		//获取storageId
+		List<StoragePrice> storagePriceList = storagePriceMapper.selectBySkupList(skupList);
+		Map<Integer, List<StoragePrice>> storagePriceMap = storagePriceList.stream().collect(Collectors.groupingBy(StoragePrice::getStorageId));
+		List<Storage> storageReqList = Lists.newArrayList();
+		for(Entry<Integer, List<StoragePrice>> entry : storagePriceMap.entrySet()) {
+			Storage storage = new Storage();
+			storage.setId(entry.getKey());
+			if(status == 1) {
+				storage.setStorageNum(entry.getValue().size());
+			}else if(status == 104) {
+				storage.setStorageNum(-entry.getValue().size());
+			}
+			
+			storageReqList.add(storage);
+		}
+		
+		updateNum = storageMapper.batchAddStorageNum(storageReqList);
+		if(updateNum != storageReqList.size()) {
+			throw new ServiceException(400, "更新库存数量失败!");
+		}
+	}
+	
+	@Override
 	public void saleSkup(Integer productId, Integer skup) {
 		checkParamValid(productId, skup);
 		checkProductStatus(productId);
diff --git a/web/src/main/resources/config.properties b/web/src/main/resources/config.properties
index ae6ab0b..0a3d639 100644
--- a/web/src/main/resources/config.properties
+++ b/web/src/main/resources/config.properties
@@ -66,9 +66,6 @@ sdk.instanceName=yohopic
 
 yoho.recovery.zkPath=/yh/config/recovery
 
-env.machineId=0
-
-ips.machine=127.0.0.1
 
 wechat.app.partnerid=1218934901
 wechat.app.partnerkey=b22de5cfd0ded341e0516505f72649a9
@@ -95,5 +92,16 @@ order.seller.appraiseFee=0.1
 order.seller.goodsPaymentRate=0.05
 order.seller.earnestMoneyRate=0.2
 order.seller.payChannelRate=0.0006
+
+order.buyer.compensate.before_seller_deliver=38
+order.buyer.compensate.before_depot_receive=68
+
+order.buyer.cancelWhenSellerDelivery.money=68
+order.buyer.cancelWhenSellerUnDelivery.money=38
+order.buyer.cancelWhenSellerDelivery.sellerGetMoneyRate=0.8
+order.buyer.cancelWhenSellerUnDelivery.sellerGetMoneyRate=0.8
+
+
+
 uic.url=http://java-yoho-uic.test3.ingress.dev.yohocorp.com/uic
 yoho.message.controller.url=http://message-controller.yohoops.org/yoho-message-controller
\ No newline at end of file
diff --git a/web/src/main/resources/databases.yml b/web/src/main/resources/databases.yml
index 6653c23..0ec9aa2 100644
--- a/web/src/main/resources/databases.yml
+++ b/web/src/main/resources/databases.yml
@@ -49,6 +49,7 @@ datasources:
            - com.yohoufo.dal.order.TradeBillsMapper
            - com.yohoufo.dal.order.OrdersPayTransferMapper
            - com.yohoufo.dal.order.ManualTransferMapper
+           - com.yohoufo.dal.order.MachineIdGenerateMapper
 
    ufo_promotion:
          servers:
diff --git a/web/src/main/webapp/META-INF/autoconf/config.properties b/web/src/main/webapp/META-INF/autoconf/config.properties
index efaf8e5..dfc3176 100644
--- a/web/src/main/webapp/META-INF/autoconf/config.properties
+++ b/web/src/main/webapp/META-INF/autoconf/config.properties
@@ -63,9 +63,16 @@ order.seller.appraiseFee=${order.seller.appraiseFee}
 order.seller.goodsPaymentRate=${order.seller.goodsPaymentRate}
 order.seller.earnestMoneyRate=${order.seller.earnestMoneyRate}
 order.seller.payChannelRate=${order.seller.payChannelRate}
+
+order.buyer.compensate.before_depot_receive=${order.buyer.compensate.before_depot_receive}
+order.buyer.compensate.before_seller_deliver=${order.buyer.compensate.before_seller_deliver}
+
+order.buyer.cancelWhenSellerDelivery.money=${order.buyer.cancelWhenSellerDelivery.money}
+order.buyer.cancelWhenSellerUnDelivery.money=${order.buyer.cancelWhenSellerUnDelivery.money}
+order.buyer.cancelWhenSellerDelivery.sellerGetMoneyRate=${order.buyer.cancelWhenSellerDelivery.sellerGetMoneyRate}
+order.buyer.cancelWhenSellerUnDelivery.sellerGetMoneyRate=${order.buyer.cancelWhenSellerUnDelivery.sellerGetMoneyRate}
+
+
 erp-gateway.url=${erp-gateway.url}
 uic.url=${uic.url}
 yoho.message.controller.url=${yoho.message.controller.url}
-
-
-ips.machine=${ips.machine}
\ No newline at end of file
diff --git a/web/src/main/webapp/META-INF/autoconf/databases.yml b/web/src/main/webapp/META-INF/autoconf/databases.yml
index 9828b84..6f64cf5 100644
--- a/web/src/main/webapp/META-INF/autoconf/databases.yml
+++ b/web/src/main/webapp/META-INF/autoconf/databases.yml
@@ -49,6 +49,7 @@ datasources:
            - com.yohoufo.dal.order.TradeBillsMapper
            - com.yohoufo.dal.order.OrdersPayTransferMapper
            - com.yohoufo.dal.order.ManualTransferMapper
+           - com.yohoufo.dal.order.MachineIdGenerateMapper
 
    ufo_promotion:
          servers: