Browse Source

客户拜访,取消功能

RaoMeng 6 years ago
parent
commit
e568d13d6c

+ 3 - 3
WeiChat/version.properties

@@ -1,5 +1,5 @@
-#Thu Nov 07 09:01:53 CST 2019
+#Tue Nov 26 17:52:52 CST 2019
 debugName=972
-versionName=704
+versionName=706
 debugCode=972
-versionCode=258
+versionCode=260

+ 3 - 3
app_core/common/src/main/res/drawable/shape_from_edit.xml

@@ -3,21 +3,21 @@
     <item  android:state_focused="true" ><shape>
             <solid android:color="#FFFFFF" />
             <stroke android:width="0.6dp" android:color="#00EEEE" />
-            <corners android:radius="8dp" />
+            <corners android:radius="6dp" />
             <padding android:bottom="0.5dp" android:left="0.5dp" android:right="0.5dp" android:top="0.5dp" />
         </shape>
     </item>
     <item  android:state_pressed="true"><shape>
             <solid android:color="#FFFFFF" />
             <stroke android:width="0.6dp" android:color="#949494" />
-            <corners android:radius="8dp" />
+            <corners android:radius="6dp" />
             <padding android:bottom="0.5dp" android:left="0.5dp" android:right="0.5dp" android:top="0.5dp" />
         </shape>
     </item>
     <item ><shape>
             <solid android:color="#FFFFFF" />
             <stroke android:width="0.6dp" android:color="#949494" />
-            <corners android:radius="8dp" />
+            <corners android:radius="6dp" />
             <padding android:bottom="0.5dp" android:left="0.5dp" android:right="0.5dp" android:top="0.5dp" />
         </shape>
     </item>

+ 78 - 0
app_modular/apputils/src/main/java/com/modular/apputils/widget/compactcalender/BillCancelPopup.java

@@ -0,0 +1,78 @@
+package com.modular.apputils.widget.compactcalender;
+
+import android.content.Context;
+import android.view.View;
+import android.view.animation.Animation;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import com.modular.apputils.R;
+
+import razerdp.basepopup.BasePopupWindow;
+import razerdp.util.InputMethodUtils;
+
+/**
+ * Created by RaoMeng on 2019/11/15
+ * Desc: 取消拜访弹出框
+ */
+public class BillCancelPopup extends BasePopupWindow implements View.OnClickListener {
+    private Context mContext;
+    private EditText mRemarkEditText;
+    private TextView mCancelTextView, mConfirmTextView;
+    private OnCancelListener mOnCancelListener;
+
+    public BillCancelPopup(Context context, OnCancelListener onCancelListener) {
+        super(context);
+        mContext = context;
+        this.mOnCancelListener = onCancelListener;
+
+        setAllowDismissWhenTouchOutside(false);
+        initViews(context);
+
+        mCancelTextView.setOnClickListener(this);
+        mConfirmTextView.setOnClickListener(this);
+    }
+
+    private void initViews(Context context) {
+        mRemarkEditText = findViewById(R.id.pop_bill_cancel_remark_et);
+        mCancelTextView = findViewById(R.id.pop_bill_cancel_cancel_tv);
+        mConfirmTextView = findViewById(R.id.pop_bill_cancel_confirm_tv);
+    }
+
+    @Override
+    public View onCreateContentView() {
+        return createPopupById(R.layout.pop_bill_input_cancel);
+    }
+
+    @Override
+    protected Animation onCreateShowAnimation() {
+        return getDefaultScaleAnimation(true);
+    }
+
+    @Override
+    protected Animation onCreateDismissAnimation() {
+        return getDefaultScaleAnimation(false);
+    }
+
+    @Override
+    public void onClick(View view) {
+        int i = view.getId();
+        if (i == R.id.pop_bill_cancel_cancel_tv) {
+            InputMethodUtils.close(mRemarkEditText);
+            dismiss();
+            if (mRemarkEditText != null) {
+                mRemarkEditText.setText("");
+            }
+        } else if (i == R.id.pop_bill_cancel_confirm_tv) {
+            InputMethodUtils.close(mRemarkEditText);
+            if (mOnCancelListener != null) {
+                mOnCancelListener.onCancelConfirm("");
+            }
+        } else {
+        }
+    }
+
+    public interface OnCancelListener {
+        void onCancelConfirm(String remark);
+    }
+}

+ 57 - 0
app_modular/apputils/src/main/res/layout/pop_bill_input_cancel.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_gravity="center"
+    android:layout_margin="26dp"
+    android:background="@drawable/shape_b2b_gray_light_line_bg"
+    android:orientation="vertical">
+
+    <EditText
+        android:id="@+id/pop_bill_cancel_remark_et"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="10dp"
+        android:background="@drawable/shape_from_edit"
+        android:gravity="left|top"
+        android:hint="请输入取消拜访计划的原因..."
+        android:maxHeight="300dp"
+        android:minHeight="120dp"
+        android:padding="6dp"
+        android:textSize="14sp"
+        tools:text="XXXXXXXXXXXXXXXXXXXXXX
+        XXXXXXXXXXXXXXXXXXXXXXXXXXXX
+        XXXXXXXXXXXXXXXXXX" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingBottom="10dp">
+
+        <TextView
+            android:id="@+id/pop_bill_cancel_cancel_tv"
+            android:layout_width="0dp"
+            android:layout_height="32dp"
+            android:layout_marginLeft="30dp"
+            android:layout_weight="1"
+            android:background="@drawable/selector_cancel_bg"
+            android:gravity="center"
+            android:text="@string/cancel"
+            android:textColor="@color/selector_cancel_text_color"
+            android:textSize="14sp" />
+
+        <TextView
+            android:id="@+id/pop_bill_cancel_confirm_tv"
+            android:layout_width="0dp"
+            android:layout_height="32dp"
+            android:layout_marginLeft="30dp"
+            android:layout_marginRight="30dp"
+            android:layout_weight="1"
+            android:background="@drawable/selector_confirm_bg"
+            android:gravity="center"
+            android:text="@string/common_sure"
+            android:textColor="@color/white"
+            android:textSize="14sp" />
+    </LinearLayout>
+</LinearLayout>

+ 5 - 0
app_modular/apputils/src/main/res/menu/menu_input_update.xml

@@ -6,4 +6,9 @@
         android:id="@+id/update"
         android:title="@string/updata"
         app:showAsAction="always" />
+    <item
+        android:id="@+id/cancel"
+        android:title="@string/cancel"
+        android:visible="false"
+        app:showAsAction="always" />
 </menu>

+ 4 - 2
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/activity/CommonDocDetailsActivity.java

@@ -325,8 +325,10 @@ public class CommonDocDetailsActivity extends BaseActivity {
             if (getToolBarTitle() != null) {
                 title = getToolBarTitle().toString();
             }
-            if (real_status == null || !(real_status.equals("已提交") || real_status.equals("已审核"))
-                    || title == null || !"出差单详情".equals(title)) {
+            //去预定按钮,只有出差单状态为【已审核】才显示
+            if ("出差单详情".equals(title) && "已审核".equals(real_status)) {
+                item.setVisible(true);
+            } else {
                 item.setVisible(false);
             }
         }

+ 228 - 6
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/CustomerVisitDetailsActivity.java

@@ -54,6 +54,7 @@ import com.modular.apputils.network.Tags;
 import com.modular.apputils.utils.UUHttpHelper;
 import com.modular.apputils.widget.BillUpdatePopup;
 import com.modular.apputils.widget.VeriftyDialog;
+import com.modular.apputils.widget.compactcalender.BillCancelPopup;
 import com.uas.appworks.R;
 import com.uas.appworks.adapter.BillListDetailsAdapter;
 
@@ -62,12 +63,16 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
-public class CustomerVisitDetailsActivity extends OABaseActivity implements BillUpdatePopup.OnUpdateSelectListener {
+public class CustomerVisitDetailsActivity extends OABaseActivity implements BillUpdatePopup.OnUpdateSelectListener, BillCancelPopup.OnCancelListener {
     private final int LOAD_FORM = 0x11;
     private final int TURN_VISIT_RECORD = 0x12;
     private final int UN_SUBMIT = 0x13;
     private final int SAVE_OUT_ADDRESS = 0x14;
+    private final int GET_CONFIGS = 0x15;
+    private final int CANCEL_VISIT = 0x16;
 
     public final int REQUESTCODE_C = 0x21;
     public final int REQUESTCODE_DB_FIND = 0x22;
@@ -76,6 +81,11 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
     public final int REQUESTCODE_ENCLOSURE_LOW = 0x25;
     public final int REQUEST_CODE_CAPTURE_PHOTO = 0x26;
     public final int REQUEST_CODE_SELECT_MORE = 0x27;
+    public final int REQUEST_SELECT_APPROVAL = 0x28;
+
+    public final int LOAD_JUDGE_APPROVAL = 0x31;//获取审批人员
+    public final int SELECT_APPROVAL = 0x32;//选择审批人
+    private final int TAG_KEY_VALUE = 0x33, TAG_FORM_CODE = 0x34;
 
     private final int TAG_ADDRESS_SELECT = 0x652;
 
@@ -90,9 +100,11 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
     private String mBillStatus;
     private List<BillGroupModel> mBillGroupModels;
     private BillUpdatePopup mBillUpdatePopup;
+    private BillCancelPopup mBillCancelPopup;
     public int selectPosition = -1;
     private List<BillGroupModel> mUpdateGroupModels = new ArrayList<>();
     private SelectAimModel address;//当前地址
+    private boolean showCancel = false;
 
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
@@ -100,10 +112,20 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
         if (TextUtils.isEmpty(mBillStatus)) {
             return super.onPrepareOptionsMenu(menu);
         } else if ("已审核".equals(mBillStatus)) {
+            getMenuInflater().inflate(com.modular.apputils.R.menu.menu_input_update, menu);
+            MenuItem updateItem = menu.findItem(R.id.update);
+            MenuItem cancelItem = menu.findItem(R.id.cancel);
             if (TextUtils.isEmpty(status) || (!"已完成".equals(status) && !"已转单".equals(status))) {
                 if (mListAdapter != null && !ListUtils.isEmpty(mListAdapter.getUpdateBillModels())) {
-                    getMenuInflater().inflate(com.modular.apputils.R.menu.menu_input_update, menu);
+                    updateItem.setVisible(true);
+                } else {
+                    updateItem.setVisible(false);
                 }
+            } else {
+                updateItem.setVisible(false);
+            }
+            if (showCancel) {
+                cancelItem.setVisible(true);
             }
         } else {
             getMenuInflater().inflate(com.modular.apputils.R.menu.menu_input_edit, menu);
@@ -143,6 +165,11 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
             } else {
                 toast(R.string.no_fields_to_update);
             }
+        } else if (item.getItemId() == R.id.cancel) {
+            if (mBillCancelPopup == null) {
+                mBillCancelPopup = new BillCancelPopup(mContext, this);
+            }
+            mBillCancelPopup.showPopupWindow();
         }
 
         return super.onOptionsItemSelected(item);
@@ -177,6 +204,7 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
         if (intent != null) {
             mCaller = intent.getStringExtra(Constants.Intents.CALLER);
             status = intent.getStringExtra(Constants.Intents.STATUS);
+            mBillStatus = intent.getStringExtra(Constants.Intents.BILL_STATUS);
             isMe = intent.getBooleanExtra(Constants.Intents.MY_DOIT, false);
             String mTitle = intent.getStringExtra(Constants.Intents.TITLE);
             mId = intent.getIntExtra(Constants.Intents.ID, 0);
@@ -193,9 +221,20 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
             statusTv.setTextColor(0xFF666666);
             statusTv.setOnClickListener(null);
         }
+        getConfigs();
         loadFormandGridDetail();
     }
 
+    private void getConfigs() {
+        showLoading();
+        mUUHttpHelper.requestCompanyHttp(new Parameter.Builder()
+                        .url("ma/setting/config.action")
+                        .addParams("caller", "sys")
+                        .addParams("code", "isCancelPlan")
+                        .record(GET_CONFIGS)
+                , mOnSmartHttpListener);
+    }
+
     private void loadFormandGridDetail() {
         showLoading();
         mUUHttpHelper.requestCompanyHttp(new Parameter.Builder()
@@ -217,6 +256,18 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
                 , mOnSmartHttpListener);
     }
 
+    private void judgeApproval(int keyValue, String formcode) {
+        mUUHttpHelper.requestCompanyHttp(new Parameter.Builder()
+                        .url("common/getMultiNodeAssigns.action")
+                        .addParams("condition", "1=1")
+                        .addParams("caller", "CancelPlan")
+                        .addTag(TAG_KEY_VALUE, keyValue)
+                        .addTag(TAG_FORM_CODE, formcode)
+                        .addParams("id", keyValue)
+                        .record(LOAD_JUDGE_APPROVAL)
+                , mOnSmartHttpListener);
+    }
+
     private OnSmartHttpListener mOnSmartHttpListener = new OnSmartHttpListener() {
         @Override
         public void onSuccess(int what, String message, Tags tag) throws Exception {
@@ -253,6 +304,65 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
                     break;
                 case SAVE_OUT_ADDRESS:
                     break;
+                case GET_CONFIGS:
+                    showCancel = !TextUtils.isEmpty(message);
+                    invalidateOptionsMenu();
+                    break;
+                case CANCEL_VISIT:
+                    if (JSONUtil.getBoolean(jsonObject, "success")) {
+                        int keyvalue = JSONUtil.getInt(jsonObject, "keyvalue");
+                        String formcode = JSONUtil.getText(jsonObject, "formcode");
+
+                        //选择审批人
+                        judgeApproval(keyvalue, formcode);
+                        if (!TextUtils.isEmpty(JSONUtil.getText(message, "exceptionInfo"))) {
+                            showToast(JSONUtil.getText(message, "exceptionInfo"));
+                        }
+                    }
+                    break;
+                case LOAD_JUDGE_APPROVAL:
+                    int keyValue = 0;
+                    String formCode = "";
+                    if (tag.get(TAG_KEY_VALUE) != null && tag.get(TAG_FORM_CODE) != null) {
+                        if (tag.get(TAG_KEY_VALUE) instanceof Integer) {
+                            keyValue = (int) tag.get(TAG_KEY_VALUE);
+                        }
+                        if (tag.get(TAG_FORM_CODE) instanceof String) {
+                            formCode = (String) tag.get(TAG_FORM_CODE);
+                        }
+                    }
+                    if (jsonObject.containsKey("assigns")) {
+                        JSONArray array = JSONUtil.getJSONArray(jsonObject, "assigns");
+                        JSONObject o = array.getJSONObject(0);
+                        String noid = "";
+                        if (o != null && o.containsKey("JP_NODEID")) {
+                            noid = o.getString("JP_NODEID");
+                        }
+                        JSONArray dataArray = null;
+                        if (o != null && o.containsKey("JP_CANDIDATES")) {
+                            dataArray = o.getJSONArray("JP_CANDIDATES");
+                        }
+                        if (!StringUtil.isEmpty(noid) && dataArray != null && dataArray.size() > 0) {
+                            // 选择审批人
+                            sendToSelect(keyValue, formCode, noid, dataArray);
+                        }
+                    } else {
+                        cancelSuccess();
+                    }
+                    break;
+                case SELECT_APPROVAL:
+                    keyValue = 0;
+                    formCode = "";
+                    if (tag.get(TAG_KEY_VALUE) != null && tag.get(TAG_FORM_CODE) != null) {
+                        if (tag.get(TAG_KEY_VALUE) instanceof Integer) {
+                            keyValue = (int) tag.get(TAG_KEY_VALUE);
+                        }
+                        if (tag.get(TAG_FORM_CODE) instanceof String) {
+                            formCode = (String) tag.get(TAG_FORM_CODE);
+                        }
+                    }
+                    cancelSuccess();
+                    break;
             }
             dimssLoading();
         }
@@ -265,10 +375,53 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
             } else {
                 showToast(message);
             }
-
+            if (what == GET_CONFIGS) {
+                showCancel = false;
+                invalidateOptionsMenu();
+            }
+            if (message.contains("该任务已经被接管,或该任务不存在!") && what == SELECT_APPROVAL) {
+                int keyValue = 0;
+                String formCode = "";
+                if (tag.get(TAG_KEY_VALUE) != null && tag.get(TAG_FORM_CODE) != null) {
+                    if (tag.get(TAG_KEY_VALUE) instanceof Integer) {
+                        keyValue = (int) tag.get(TAG_KEY_VALUE);
+                    }
+                    if (tag.get(TAG_FORM_CODE) instanceof String) {
+                        formCode = (String) tag.get(TAG_FORM_CODE);
+                    }
+                }
+                cancelSuccess();
+            }
         }
     };
 
+    private void sendToSelect(int keyValue, String formCode, String noid, JSONArray data) {
+        ArrayList<SelectBean> beans = new ArrayList<>();
+        SelectBean bean = null;
+        Map<String, Object> map = new HashMap<>();
+        map.put("keyValue", keyValue);
+        map.put("formCode", formCode);
+        map.put("noid", noid);
+        String json = JSONUtil.map2JSON(map);
+        for (int i = 0; i < data.size(); i++) {
+            bean = new SelectBean();
+            bean.setName(data.getString(i));
+            bean.setJson(json);
+            bean.setClick(false);
+            beans.add(bean);
+        }
+        Intent intent = new Intent(ct, SelectActivity.class);
+        intent.putExtra("type", 2);
+        intent.putParcelableArrayListExtra("data", beans);
+        intent.putExtra("title", "选择审批人");
+        startActivityForResult(intent, REQUEST_SELECT_APPROVAL);
+    }
+
+    private void cancelSuccess() {
+        Toast.makeText(ct, "拜访计划取消成功", Toast.LENGTH_LONG).show();
+        finish();
+    }
+
     private void handlerFormData(JSONObject datas) throws Exception {
         mBillGroupModels = new ArrayList<>();
         //配置主表
@@ -468,6 +621,33 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
         }
     }
 
+    @Override
+    public void onCancelConfirm(String remark) {
+        cancelVisit(remark);
+    }
+
+    /**
+     * 取消拜访
+     *
+     * @param remark
+     */
+    private void cancelVisit(String remark) {
+        showLoading();
+        Map<String, Object> params = new HashMap<>();
+        params.put("cpd_planid", mId);
+        params.put("cpd_remark", remark);
+        mUUHttpHelper.requestCompanyHttp(new Parameter.Builder()
+                        .url("mobile/oa/commonSaveAndSubmit.action")
+                        .mode(Method.POST)
+                        .addParams("caller", "CancelPlan")
+                        .addParams("id", 0)
+                        .addParams("formStore", "")
+                        .addParams("othergridStore", "")
+                        .addParams("gridStore", JSON.toJSONString(params))
+                        .record(CANCEL_VISIT)
+                , mOnSmartHttpListener);
+    }
+
     @Override
     public void onUpdateConfirm(List<BillGroupModel> billGroupModels, List<BillGroupModel.BillModel> updateBillModels) {
         mUpdateGroupModels = billGroupModels;
@@ -545,8 +725,8 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
 
         saveAndSubmit(billGroupModels);
     }
-
     //保存外勤计划目的地
+
     private void saveOutAddress(Map<String, Object> tagMap) {
         String company = (String) tagMap.get("company");
         String companyAddress = (String) tagMap.get("companyAddress");
@@ -781,8 +961,8 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
         mBillModel.setLength(0);
         uploadFile(mBillModel);
     }
-
     //上传文件
+
     private void uploadFile(final BillGroupModel.BillModel mBillModel) {
         String path = null;
         if (mBillModel.getLength() < ListUtils.getSize(mBillModel.getLocalDatas())) {
@@ -1146,9 +1326,52 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
                 SelectAimModel chcheAimModel = data.getParcelableExtra("data");
                 sureSelectAim(chcheAimModel);
                 break;
+            case REQUEST_SELECT_APPROVAL:
+                SelectBean d = data.getParcelableExtra("data");
+                if (d == null) return;
+                String name = StringUtil.isEmpty(d.getName()) ? "" : d.getName();
+                String jsonObject = StringUtil.isEmpty(d.getJson()) ? "" : d.getJson();
+                getEmnameByReturn(name, jsonObject);
+                break;
         }
     }
 
+    public void getEmnameByReturn(String text, String jsonObject) {
+        LogUtil.i("gong", "text=" + text + "   ||jsonObject=" + jsonObject);
+        if (StringUtil.isEmpty(text)) {
+            return;
+        }
+        Pattern pattern = Pattern.compile("(?<=\\()(.+?)(?=\\))");
+        Matcher matcher = pattern.matcher(text);
+        while (matcher.find()) {
+            String name = matcher.group();
+            if (!StringUtil.isEmpty(name)) {
+                selectApproval(name, jsonObject);
+                return;
+            }
+        }
+    }
+
+    //提交动作,增加判断节点是否有多人的情况
+    private void selectApproval(String emName, String jsonObject) {
+        JSONObject object = JSON.parseObject(jsonObject);
+        String nodeId = JSONUtil.getText(object, "noid");
+        String formCode = JSONUtil.getText(object, "formCode");
+        int keyValue = JSONUtil.getInt(object, "keyValue");
+        showLoading();
+        Map<String, Object> params = new HashMap<>();
+        params.put("em_code", emName);
+        params.put("nodeId", nodeId);
+        mUUHttpHelper.requestCompanyHttp(new Parameter.Builder()
+                        .url("common/takeOverTask.action")
+                        .addParams("_noc", 1)
+                        .addTag(TAG_KEY_VALUE, keyValue)
+                        .addTag(TAG_FORM_CODE, formCode)
+                        .addParams("params", JSONUtil.map2JSON(params))
+                        .record(SELECT_APPROVAL)
+                , mOnSmartHttpListener);
+    }
+
     private void sureSelectAim(SelectAimModel entity) {
         if (entity == null || selectPosition < 0 || selectPosition > ListUtils.getSize(mBillUpdatePopup.getGroupModels())) {
             selectPosition = -1;
@@ -1220,5 +1443,4 @@ public class CustomerVisitDetailsActivity extends OABaseActivity implements Bill
 
         mBillUpdatePopup.getBillUpdateAdapter().notifyDataSetChanged();
     }
-
 }